home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 January: Mac OS SDK / Dev.CD Jan 96 SDK / Dev.CD Jan 96 SDK1.toast / Development Kits (Disc 1) / Installer / Installer 4.0.3 / Installer 4.0.3 Technical Guide / Installer 4.0.3 Technical Guide
Encoding:
Text File  |  1994-09-14  |  880.2 KB  |  2,216 lines  |  [ONLN/HLX2]

  1.  
  2. Scripting Overview
  3. Scripting Overview    6
  4. Script Resources for Displaying the Interface    6
  5. Script Resources for Describing Actions    7
  6. Independent Script Resources    8
  7. Installation Timeline    9
  8. Launching    9
  9. Installer Rule Evaluation    9
  10. Preflighting    10
  11. Preparation to Install/Remove    10
  12. Reading Source File, Rsrc or Font (for each atom)    11
  13. Writing Target File, Rsrc or Font (for each atom)    11
  14. Finalizing    11
  15. Installer Human Interface
  16. Easy Install Interface    12
  17. Using the Target Disk Interface    13
  18. Using the Application Folder Interface    13
  19. Buttons    13
  20. Custom Install Interface    14
  21. Custom Install List    14
  22. Selected Size and Disk Space Available Values    15
  23. Custom Item Information    15
  24. Custom Remove Interface    16
  25. Selecting the Target Application Folder    17
  26. Selecting the System Volume    18
  27. Adding a Splash Screen    19
  28. Providing User Help    20
  29. Selecting an Installer Document    20
  30. Menus    21
  31. Apple Menu    22
  32. Help Menu    22
  33. Application Menu    22
  34. Using the Installer Preference Resource (‘inpr’)    22
  35. Controlling the Recommended Target Selection    23
  36. Specifying Help Pages    23
  37. Allowing Installation onto AppleShare Volumes    24
  38. Installer Preference Resource Reference    24
  39. Resource Description    24
  40. Data Structures    26
  41. Packages and Atoms
  42. About Packages (‘inpk’)    27
  43. Using Packages    27
  44. Using Packages with Easy Install    27
  45. Using Packages with Custom Install and Remove    27
  46. Atom Execution Order    28
  47. Package Reference    28
  48. Package Resource Description    28
  49. Package Comment Resource Description    30
  50. New Package Comment Resource Description    30
  51. Old Package Comment Resource Description    31
  52. About the File Atom    32
  53. Using the File Atom (‘infa’)    32
  54. Comparing Files by Version    32
  55. Using Split Sources with File Atoms    33
  56. Using Atom Extenders with File Atoms    33
  57. Installing a Custom Folder Icon    34
  58. File Atom Reference    34
  59. Resource Description    34
  60. About the Resource Atom (‘inra’)    38
  61. Using the Resource Atom    39
  62. Comparing Files By Version    39
  63. Using Split Sources with Resource Atoms    39
  64. Using Atom Extenders with Resource Atoms    39
  65. Resource Atom Reference    40
  66. Resource Description    40
  67. About the Resource List Atom (‘inr#’)    44
  68. Using the Resource List Atom    44
  69. Referencing Resource Atom Lists from Packages    44
  70. Resource List Atom Reference    44
  71. Resource Description    45
  72. About the Font Atom (‘inff’)    46
  73. Using the Font Atom    46
  74. Auto-Routing Under Pre-7.1 Systems    46
  75. Using Atom Extenders with Font Atoms    47
  76. Font Atom Reference    47
  77. Resource Description    47
  78. About the ResMerge Atom (‘inrm’)    53
  79. Using the ResMerge Atom    53
  80. ResMerge Atom Reference    54
  81. About the Folder Atom (‘infm’)    55
  82. Using the Folder Atom    55
  83. Specifying the Source and Target Folder    56
  84. Installing Folders with Custom Icons    56
  85. Creating Empty Folders with a Folder Atom    56
  86. Folder Atom Reference    56
  87. Using Action Atoms (‘inaa’)    57
  88. Action Atom Reference    57
  89. Resource Description    58
  90. Data Structures    59
  91. Function Interface    59
  92. Parameter Block    59
  93. Using Audit Atoms (‘inat’)    61
  94. Audit Atom Reference    61
  95. Resource Description    61
  96. Using Boot Block Atoms (‘inbb’)    62
  97. Boot Block Atom Reference    62
  98. Resource Description    62
  99. About Atom Extenders (‘inex’)    65
  100. Writing Atom Extenders    66
  101. Creating an ‘inex’ Script Resource    66
  102. Writing a Simple Atom Extender    66
  103. Memory Allocation within Atom Extenders    69
  104. Running within a Sub-Heap    69
  105. Converting Existing Decompression Code    70
  106. Atom Extender Reference    70
  107. Resource Description    70
  108. Data Structures    72
  109. Function Interface    72
  110. Parameter Block    72
  111. About Version Compare Functions (‘invc’)    76
  112. Using Version Compare Functions with File Atoms    76
  113. Using Version Compare Functions with Resource Atoms    77
  114. Version Compare Runtime Environment    77
  115. Version Compare Function Reference    77
  116. Function Interface    77
  117. Parameter Block    78
  118. Resource Description    78
  119. Installer Rules
  120. Frameworks (‘infr’)    79
  121. Global Rule Framework    79
  122. Easy Install Rule Framework    79
  123. Custom Install Rule Framework    80
  124. Rules (‘inrl’)    80
  125. Using Assertions    82
  126. Rule Clause Reference    83
  127. Global Rule Clauses    83
  128. Easy Install Rule Clauses    91
  129. Custom Install Rule Clauses    92
  130. File Specification
  131. About File Specifications    93
  132. Specifying Target Files (‘intf’)    93
  133. Installing into Special Folders    93
  134. Installing into the User-Selected Application Folder    94
  135. Managing Rollbacks on Multiple Target Volumes    94
  136. Installing onto the Installer Volume    95
  137. Setting the Finder flags and Dates    95
  138. Specifying Source Files (‘infs’)    95
  139. Source Disk Search Path    95
  140. File Spec. Reference    96
  141. Resource Descriptions    96
  142. Target File Spec. Resource (‘intf’)    96
  143. Source File Spec Resource (‘infs’)    98
  144. About File Searching (‘insp’)    99
  145. Using File Searching with File and Resource Atoms    99
  146. Using File Searching with Rule Clauses    99
  147. Allowable Installer Functions During File Searching    99
  148. File Searching Reference    100
  149. Data Structures    100
  150. Function Interface    100
  151. Parameter Block    100
  152. Resource Description    101
  153. About the Disk Order Resource (‘indo’)    102
  154. Disk Order Reference    103
  155. Resource Description    103
  156. Installer Functions
  157. About Installer Functions    104
  158. Data I/O Routines    104
  159. Memory Routines    108
  160. Misc. Routines    110
  161. Miscellaneous Features
  162. About Action Handlers    113
  163. Writing an Action Handler    113
  164. Action Handler Runtime Environment    114
  165. Action Handler Reference    114
  166. Data Structures    114
  167. Function Interface    114
  168. Parameter Block    114
  169. Actions    115
  170. Resource Description    117
  171. About the Installer Version Resource (‘invs’)    118
  172. Installer Version Reference    119
  173. Resource Description    119
  174. About the Script Size Resource (‘insz’)    119
  175. Script Size Reference    119
  176. Resource Description    119
  177. About the Script Creation Date Resource (‘incd’)    120
  178. Script Creation Date Reference    120
  179. Resource Description    120
  180. Installation Topics
  181. Installing Desk Accessories    121
  182. Installing into Pre-7.X Systems    121
  183. Installing into System 7.X    122
  184. Glossary
  185. Glossary    123
  186.  
  187. Scripting Overview
  188. This chapter provides an overview of writing Installer scripts.
  189. Scripting Overview
  190. An Installer script is a list of instructions for the Installer, in the form of resources.  These script resources tell the Installer how to perform an Installation.  An Installer script is written using the MPW (Macintosh Programmer's Workshop) Rez language, and compiled using the MPW Rez tool.  It is expected that Installer scriptwriters are familiar with the Rez language, MPW development system, and the MPW Rez tool.
  191. The script resources can be divided into three main groups:  script resources for displaying the interface, script resources for describing what actions to perform during the installation or removal, and independent script resources.
  192. Script Resources for Displaying the Interface
  193. The scriptwriter is responsible for providing a recommended software selection for Easy Install, and an optional list of software choices for Custom Install.  Each interface requires the scriptwriter to create instructions (Installer rules) that are evaluated to tell the Installer what to display to the user and what will happen during the installation or removal.  
  194. It is useful to think of script resources as working in a hierarchy.  At the top of the hierarchy are framework (‘infr’) and rule (‘inrl’) script resources.  The Installer uses these resources to examine the environment and make decisions about what to install based on what it has found on the user’s target disk.  For example, in System Software, we install different software depending on the type of machine the Installer is running on, the type of target disk the user has chosen, and what has previously been installed.  To use these features, the scriptwriter must provide a set of if-then rules to reach the goal of each interface.
  195. Easy Install interface goals:
  196. n    Create the recommended software message that will be shown in the Easy Install dialog.  This translates into including the proper rule clauses that will display the desired message or error text.
  197. n    Tell the Installer what actions to take after the user clicks the Install button.  This requires the scriptwriter to add to the list of packages that should be installed.
  198. Custom Install interface goals:
  199. n    Specify the software components to be listed in the Custom Install dialog.  Each top-level item equates to a package, with possible sub-packages, that the scriptwriter explicitly adds to the list.
  200. Script Resources for Describing Actions
  201. Installer rules specify the actions to be performed by selecting a set of packages (resource type 'inpk').  Packages have names, associated comment resources, and a list that references atoms.  Atoms are script resources that describe a specific action to be performed during an installation or removal, such as copy a file or delete a resource.
  202. In addition to atoms, packages may also reference other packages called subpackages.  Subpackages are identical to packages and have two main purposes: to provide the hierarchical list shown in the Custom Install dialog and to make scripting simpler.
  203. In the hierarchy of Installer script resources, atoms are at the lowest level.  Atoms come in six flavors:  File Atoms, Resource Atoms, Font Atoms, ResMerge Atoms, Folder Atoms, Action Atoms, Audit Atoms and Boot Block Atoms (resource types 'infa', 'inra', 'inff’, ‘inrm', ‘infm', 'inaa', 'inat', and 'inbb', respectively).  Note that atoms are not visible to the user of the Installer program.  All atoms are contained within packages or subpackages.
  204. Independent Script Resources 
  205. Seven independent script resources can optionally be added to the script to control miscellaneous Installer actions and interface parts.
  206. Installation Timeline
  207. Many activities occur during an installation or removal.  Keeping the order and dependencies straight is a challenge.  To help you understand the specific events that happen during an installation, the seven phases are summarized below.
  208. Launching
  209.     User opens Installer.            
  210.     Installer finds and opens script document.                    
  211.     Read ‘insz’ if it exists and create the script’s sub-heap.                            
  212.     Find the Splash Screen PICT.                                    
  213.     User reads and dismisses the Splash Screen.                                            
  214.     Setup Function is called, if it exists.                                                    
  215.             
  216. Installer Rule Evaluation
  217.     Begin execution of Global Rules, then the rules for the current interface mode (Easy or Custom).        
  218.     Call code resources referenced by CheckUserFunction and CheckRuleFunction rule clauses when, and if, the rule clause is evaluated.                                    
  219.     Call File Searching code resources referenced by Target File Specs that are referenced by rule clauses.  The code resource is called once for each Target File Spec regardless how many rule clauses reference the Target File Spec.                                    
  220.     User sees the Easy, Custom or Remove dialog.                                                    
  221.             
  222. Preflighting
  223.     User clicks the Install or Remove button.        
  224.     Preparing to install dialog appears.        
  225.     Call File Search code resource for all relevant Target File Specs.                
  226.     Check each target file, rsrc or font to compute needed space.                        
  227.     Call Version Compare code resource for File Atoms and Rsrc Atoms as necessary.                                        
  228.     Verify that no target files match any source files.                                                            
  229.             
  230. Preparation to Install/Remove
  231.     Confirm shutting down running applications if live installation or removal.        
  232.     Status Dialog appears.        
  233.     Save off original files, as necessary, if disk space available.            
  234.     Send ‘Initialize’ message to Atom Extenders.                        
  235.     Call ‘before’ Action Atoms.                                    
  236.     Dispose of script sub-heap if extra memory is needed.                                                    
  237.     Delete old files, resources and fonts.                                                        
  238.             
  239. Reading Source File, Rsrc or Font (for each atom)
  240.     Open source file.        
  241.     User sees “Reading…” in Status Dialog.            
  242.     Send ‘BeforePart’ message to Atom Extender.                    
  243.     If the Atom Extender did not read the data, the Installer reads as much data as possible, placing each chunk into the buffer list.  If not enough memory is free to buffer the data, the buffer list is flushed and the data is written to disk.                            
  244.     Close source file, if necessary.                                                            
  245.             
  246. Writing Target File, Rsrc or Font (for each atom)
  247.     Open target file.        
  248.     User sees “Writing…” in Status Dialog.            
  249.     Write buffered data into target file, rsrc or font resource.                
  250.     Send ‘AfterPart’ message to Atom Extender.                                                
  251.     Close target file, if necessary.                                                            
  252.             
  253. Finalizing
  254.     Send ‘Success’ or ‘Cancel ‘ message to Atom Extenders.        
  255.     Send ‘after’ or ‘cleanUpCancel’ message to ‘after’ Action Atoms.                        
  256.     Successful or error dialog appears.  If the user clicks the Continue button then the Installer continues with the next step then begins again with Rule execution.                                            
  257.     Create script sub-heap again if we disposed of it earlier.                                                        
  258.             
  259.  
  260. Installer Human Interface
  261. This chapter describes the human interface aspects of Installer 4.0.
  262. Easy Install Interface
  263. The Easy Install interface now allows user selection of the target application folder and a larger message area.  The target selection area is different for scripts requiring selection of an application folder versus selection of a target disk.
  264. Figure 2-1    The Easy Install dialog.
  265. Using the Target Disk Interface
  266. If your product must always be installed into a specific location on the target disk, then you’ll probably want to limit the user to only selecting from the mounted volumes.  This is the case for products, such as system software, that need to be installed predominately in the System Folder.  Setting the useDiskTargetMode flag in the preference resource tells the Installer to present an interface compatible with the old Installer 3.X.
  267. Clicking Switch Disk cycles through the mounted volumes.  Clicking Eject Disk will eject a chosen ejectable disk.
  268. Using the Application Folder Interface
  269. If your script installs a product such as an application which can be placed most anywhere on the user's Macintosh, then you’ll probably want to allow the user to select a target folder.  Setting the useFolderTargetMode flag in the preference resource tells the Installer to present an interface to the user for selecting the target folder in both the Easy Install and Custom Install dialogs.  This interface is shown in Figure 2-2.
  270. Much like the current special-xxxx folder path identifier, the new folder-user folder path identifier will be the folder path selected by the user.  When the user clicks the Select Folder button a modified standard file dialog appears to allow selection of a new or existing folder.  This dialog is discussed in the section “Using the Select Folder Dialog”.
  271. Figure 2-2    The interface for selecting an application folder.
  272. The icon and name for the selected folder depends on the folder chosen by the user:
  273. n    If a folder is selected, the folder’s icon will appear with the folder's name on the first line and “on the disk “Macintosh HD”” on the second line.  
  274. n    If the root level of a volume is selected, the volume’s icon and name will appear.
  275. A default target folder is always recommended to the user when first launching the Installer.  The scriptwriter can optionally override the Installer’s suggested default folder using the preference resource.
  276. Buttons
  277. Buttons and their actions:
  278. n    Install (or Remove) — Starts the installation or removal.  The button is enabled in Easy Install if there was not an error preventing the installation from beginning.  In Custom Install and Custom Remove, the button is enabled only if one or more items are selected from the list.
  279. n    Quit — Quits the Installer application.
  280. n    Help — Opens a the Help dialog.  The Help dialog is explained in section “Providing User Help”.
  281. n    Switch Disk — Changes the currently selected target disk to the next disk in the volume list.  If no other volumes are available to choose from, this button is dimmed.  This button is only shown when using the target disk interface mode.
  282. n    Eject Disk — Ejects the currently selected target disk.  The button is dimmed if the current volume cannot be ejected.  This button is only visible when using the target disk interface mode.
  283. n    Select Folder — Opens the folder selection dialog.  The folder selection dialog is explained in section “Selecting the Target Application Folder”.  If the scriptwriter has enabled this feature, and the Option Key is down, the button text changes to “System Disk” and opens the system volume selection dialog.  The system volume selection dialog is explained in section “Selecting the System Volume”.  This button is only visible when using the application folder interface mode.
  284. Custom Install Interface
  285. The Custom Install dialog can provide experienced users with the flexibility needed to create customized installations of your product.
  286. Figure 2-3    The Custom Install dialog
  287. Custom Install List
  288. Hierarchical custom items allow many opportunities to provide specific choices without cluttering the list or confusing novice users.  Users click on the familiar checkbox to select and deselect items in the custom list.  Selection rules apply to the relationship between parent and child items:
  289. n    When the user selects/deselects an open parent item, all children are shown selected/deselected as well.  This helps the user understand the relationship between the parent and child items.  Selecting a parent is equal to selecting all the parent’s children and vice versa.
  290. n    If the user opens an unselected parent item and begins to select child items, the parent item is displayed with a mixed-state checkbox.  A parent item becomes selected if all child items are selected.  If all child items are unselected the parent item is displayed unselected.  A parent item is displayed as a mixed-state checkbox if a child (which is also a parent item) is displaying a mixed-state checkbox.
  291. Selected Size and Disk Space Available Values
  292. Two additional information fields show the total size of the currently selected custom items and the disk space available on the selected target disk.  The size information is very handy for users choosing which software options to install.  The scriptwriter will have the option to show or hide these fields using a flag in the preference resource.
  293. NOTE
  294. The Installer only uses the leaf package sizes of the selected custom items to calculate the selected size value.  For packages that referenece both atoms and sub-packages, it’s best to create another package that contains only the atoms and reference that package in place of the atoms.
  295. For example, if you have this:                                         Use this instead:
  296.                           u
  297. Custom Item Information
  298. Custom item information can be viewed in a separate info dialog by clicking on the button () to the right of custom item text.  The custom item info dialog is shown in Figure 2-4.
  299. Figure 2-4    The Custom Item Info Dialog
  300. Custom Remove Interface
  301. Prior to Installer 4.0, the user had to hold down the option key to enable the remove feature.  By selecting the Custom Remove pop-up menu item, the user can go to the Custom Remove window.
  302. Figure 2-5    The Custom Remove dialog
  303. The Custom Remove window layout looks very similar to that of Custom Install.  The main difference is that the items in the Custom Install list which are not removable are dimmed, and the Install button is titled “Remove”.
  304. Selecting the Target Application Folder
  305. If the scriptwriter allows the user to select a target folder, a modified Standard File dialog is shown when the user clicks the Select Folder button.  The Select Folder dialog is shown in Figure 2-6.
  306. Figure 2-6    The Select Folder dialog
  307. To select a target folder using the Select Folder dialog, the user selects the folder or disk in the list, and then clicks the Select button.  If no items are selected, clicking the Select button chooses the folder or disk whose contents are showing in the list.  The Open button is enabled whenever a folder, disk or alias is selected in the list.  If the folder or disk is not a valid target disk the Select button is disabled, such as for a locked floppy disk or a sever volume.
  308. The Installer always recommends a target application folder to the user when first launching the Installer.  The user is shown the contents of the folder when first opening the Select Folder dialog.  If the folder does not already exist, the folder is created so the user can either click Cancel or Select and maintain the recommended selection.
  309. NOTE
  310. We suggest that scriptwriters place the application and associated files and folders directly in the recommend target folder.  This provides a visual association between the folder in the Installer’s dialog and the application folder of the same name that is created on the hard disk.  This also allows an existing application to be updated more easily.  u
  311. Selecting the System Volume
  312. Scriptwriters can allow the user to change the recommended system volume when using the application folder interface.  A flag in the preference resource determines if this feature is enabled.  The Installer initially recommends that system files be installed on the boot volume.  The scriptwriter can override this recommendation using the Setup Function described in the section “Using the Installer Preference Resource”.
  313. The user accesses the Select System Volume dialog by holding down the Option key while clicking the Select Folder button. The Select System Volume dialog is shown in Figure 4-6.
  314. Figure 2-7    The Select System Volume dialog
  315. The user can change the currently selected system volume by choosing a different volume from the pop-up menu.  Only valid system volumes (those that contain blessed folders) are shown in the menu.
  316. Adding a Splash Screen
  317. The first screen to be displayed when the Installer is launched is found in the script.  If you would like to provide your own splash screen, simply include a 'PICT' resource named “Splash Screen”  with a resource ID greater than 1024.  The Installer loads the picture from the script and displays it, along with an OK button in the lower right corner to dismiss the splash screen.
  318. You can also have a color splash screen.  In addition to the PICT named “Splash Screen”, include a color PICT named “Color Splash Screen”.  If the screen has a depth of 4 bits per pixel or greater (16 colors/grays or more) then the Installer will use this PICT instead.  Note that you should use the default system color palette for best results.
  319. Create a picture using a drawing or painting program.  You will want your picture to be no bigger than 220 (height) by 433 (width) pixels.
  320. The AppleGaramond font is recommended for titles and the help screen fonts included with the SDK for text.  Since you cannot be sure your chosen fonts will always be available, it’s best to create a bitmap picture when using fonts other than Geneva 9, 12, Chicago 12 and Monaco 9.
  321. If necessary, convert the picture to a bitmap and copy it into the clipboard.  Paste the picture from the clipboard into a newly created ResEdit file.  This should create several resources, including a 'PICT' resource.  Delete all of the resources you’ve created except the 'PICT'.  Save the ResEdit 'PICT' file.
  322. DeRez the ResEdit 'PICT' file using MPW.  We use the following DeRez command:
  323.     DeRez 'ResEdited-Splash' -only PICT {MPW}RIncludes:Pict.r >> Script.r
  324. This command appends the Rez definition of the 'PICT' to the end of your script.
  325. Open the script file you just appended the 'PICT' to, go to the end, change the name of the 'PICT' resource (or give it a name if it doesn’t have one) to “Splash Screen”, and ensure that its ID is greater than 1024.  Your script now contains the picture in a format Rez can handle when building the script into resource format.
  326. Providing User Help
  327. Clicking the Help button in the Installer window opens the Installer Help window which displays PICTs stored in the Installer or script file.  The Installer Help window is shown in Figure 2-8.
  328. Figure 2-8    The Installer Help window
  329. The Installer ships with several simple help screens, but you can override specific default screens and add to the default help pages.  The Preference Resource contains a list of the help pages and is discussed in the section “Using the Installer Preference Resource”.
  330. NOTE
  331. Easy-to-read screen fonts, as seen in Figure 2-8, are included in the SDK for your convenience.  We suggest that you use these fonts for your help window and splash screen text.  u
  332. Selecting an Installer Document
  333. When the user opens the Installer application directly the Installer searches the folder containing the application for one valid document.  If no documents or multiple documents are found the Installer displays the dialog shown in Figure 2-9.
  334. Figure 2-9    The Document Not Found Dialog
  335. Clicking Choose displays the standard Open Dialog so the user can choose one Installer document to open.  Clicking Cancel in the Open Dialog quits the Installer.
  336. After opening the Installer document the Installer looks for the script version resource (‘invs’) to determine if the version of the Installer application is properly matched to the version of the script.   With Installer version 4.0.3 and newer, the Installer will allow the user to open a document with a smaller version than the Installer.  If this is the case, the Installer shows the dialog in Figure 2-10.
  337. Figure 2-9    The Early Version Document Dialog
  338. Menus
  339. To allow the user to easily switch processes and to turn balloon help on and off the Help menu and Application menus will be shown under System 7.X.  An “About Installer…” item will be shown in the Apple menu.
  340. Apple Menu 
  341. The Apple Menu will be shown in full when running under 7.X, but will only contain the “About Installer…” item when running on pre-7.0 systems.  Desk Accessories will not be shown in the menu under pre-7.0 systems to restrict DAs from being opened within the Installer.
  342. Figure 2-10    The Apple Menu.
  343. Help Menu 
  344. The Help menu will be available to users when running under System 7.X.  In addition to the standard two menu items the Installer will add an “Installer Help…” item that opens the Installer’s help window.
  345. Figure 2-11    The Help Menu.
  346. The Help menu is not available when running under pre-7.0 systems.
  347. Application Menu 
  348. The Application menu will be available to users when running under System 7.X.  Under pre-7.0 systems using MultiFinder the user can switch between applications by clicking on the MultiFinder icon.
  349. Figure 2-12    The Application Menu.
  350. Using the Installer Preference Resource (‘inpr’)
  351. The preference resource allows the scriptwriter to override certain default interface features and actions of the Installer.  To utilize this control you must add a preference resource (‘inpr’ ID=300) to the script file.  The Installer contains a default ‘inpr’ resource with the ID of 305.  The Installer first looks for your ‘inpr’ with the ID 300, and if not found uses its default resource.
  352. The fields and flags in the preference resource control two main areas of the Installer, the recommended target disk/folder selection, and specific human interface elements.
  353. Controlling the Recommended Target Selection
  354. The Installer automatically recommends the target disk, target folder and system disk if the scriptwriter does not provide a preference resource in the script file.  If you wish to allow the user to select a target folder then it’s important to at least provide a suggested folder name in your preference resource.  To have more control over the recommended target disk, target folder and system disk you can supply a code resource to be called to determine these values.  This code resource is referred to as the setup function.
  355. The setup function can recommend the initial values for target disk, target folder and system disk, but the Installer will consider these new values only as suggestions and will not use any value that would be unreasonable.  The setup function is called prior to rule execution, or if a splash screen is provided, after the user dismisses the splash screen. 
  356. If no setup function is supplied, or a value recommend by the setup function is not valid, the Installer selects the target values using the following strategy:
  357. n    Target disk — The Installer first looks for the selected boot disk (value stored in PRAM), then looks at the SCSI ID 0 hard disk, then at the other SCSI disks, then for an old HD 20 hard disk, then any mounted floppies, then the RAM disk, and finally any mounted volume.
  358. n    Target application folder — Selects the folder with the name specified in the script file’s preference resource on the root level of the target disk.  If the scriptwriter does not provide a preference resource, the preference resource in the Installer file will be used.  The current default folder name is “Applications”.
  359. n    System disk — Looks first at the boot disk and then the selected boot disk (value stored in PRAM), and if one contains a blessed System Folder and is a valid target volume and not a floppy disk selects that volume.  Otherwise, selects the recommended target disk regardless if it contains a blessed System Folder or not.
  360. Specifying Help Pages
  361. The preference resource holds the list of ‘PICT’ resource IDs that specify the pages shown in the help window. 
  362. The help window is divided into two vertical sections:
  363. n    Graphic Section — This section begins at the left edge of the window and extends to the right edge of the window.  Most often you’ll use this section to display a 100 pixel wide color graphic that can be shared among several pages.  This strategy saves disk space.  If you have simple help pages that are all B/W, then use this section to display a ‘PICT’ resource that is the same width as the help window.  Enter zero for the ID to leave this section blank.
  364. n    Text Section — This section begins 100 pixels from the left edge of the window and extends to the right edge of the window.  This section is used most often to hold text that does not contain color.  Enter zero for the ID to leave this section blank.
  365. Two ‘PICT’ resource IDs must be entered for each section, one for display on B/W monitors and the other for monitors displaying 256 or more colors/grays.  You may use the same ID for both color and B/W ‘PICT’ IDs.  Use the special ID of 0 (zero) to display white space in a section. 
  366. The Installer ships with several basic help pages, which you can add to or replace with your own ‘PICT’ resources stored in your script file.
  367. Allowing Installation onto AppleShare Volumes
  368. Using the allowServerAsTarget flag allows the user to select and install onto AppleShare volumes.  This flag is an unsupported and untested feature, and is available only as a courtesy to those developers that have hacked previous versions of the Installer to gain this functionality.
  369. s    W A R N I N G
  370. Only those scriptwriters that absolutely, positively, must allow their users to install onto AppleShare server volumes should use the allowServerAsTarget flag!  You should never try to install anything into the server volume’s System Folder!  s
  371. Installer Preference Resource Reference
  372. This section describes the resource description of the ‘inpr’ resource.
  373. Resource Description
  374. Format 0 of the new ‘inpr’ resource:
  375. #define    preferenceFlags                                                        \
  376.     boolean    useDiskTargetMode, useFolderTargetMode;                    \
  377.     boolean    dontAllowUserToSetSystemDisk, allowUserToSetSystemDisk;\
  378.     boolean    dontShowSelectedSizeInCustom, showSelectedSizeInCustom;\
  379.     boolean    noSetupFunctionSupplied, setupFunctionSupplied;            \
  380.     boolean    dontAllowCleanInstall, allowCleanInstall;                    \
  381.     boolean    dontAllowServerAsTarget, allowServerAsTarget;            \
  382.     fill bit[10];
  383. type 'inpr' {
  384.         switch {
  385.             case format0:
  386.                 key integer = 0;        /* Preference version */
  387.                 preferenceFlags;        /* Preference Flags */
  388.                 literal longint;        /* Setup Function Type */
  389.                 integer;                /* Setup Function Code Rsrc Id */
  390.                 unsigned integer = $$CountOf(helpPagelist);    
  391.                 wide array helpPagelist {
  392.                     /* Help Page */
  393.                     integer;                /* B/W Graphic Section ‘PICT’ ID */
  394.                     integer;                /* B/W Text Section ‘PICT’ ID */
  395.                     integer;                /* 8-Bit Graphic Section ‘PICT’ ID */
  396.                     integer;                /* 8-Bit Text Section ‘PICT’ ID */
  397.                 };
  398.                 pstring; align word;    /* Default Folder name */    
  399.         };
  400. };
  401. Flag descriptions
  402. useDiskTargetMode/useFolderTargetMode 
  403. Specifies whether the user can choose a target folder, or is limited to choosing a target disk.  If the useDiskTargetMode flag is specified, “Switch Disk ” and “Eject Disk” buttons are shown to the user.  This is very similar to the old Installer 3.X.  If the ‘useFolderTargetMode’ flag is specified, the interface appears with a “Select Folder…” button, instead of the “Switch Disk ” and “Eject Disk” buttons.
  404. dontAllowUserToSetSystemDisk/allowUserToSetSystemDisk 
  405. Specifies whether the user can change the recommended System disk.  If the allowUserToSetSystemDisk flag is specified, the “Select Folder…”  button changes to “System Disk…” when the Option Key is depressed.  Clicking the “System Disk…” button displays a dialog  with a pop-up of the valid System disks.
  406.     The allowUserToSetSystemDisk  flag is ignored unless the useFolderTargetMode flag is set (see section above). If the useDiskTargetMode flag is used, there is no change to the “SwitchDisk”  button when the Option Key is pressed.
  407. dontShowSelectedSizeInCustom/showSelectedSizeInCustom
  408. Specifies whether the Installer should calculate and show the total size of the currently selected custom items in the Custom and Remove Install interfaces.  Since the Installer does not look at the target disk when calculating this value, it will almost always be overestimated.  Common packages are only included once in the calculation, but for some scripts this may confuse more than help the user, so use the dontShowSelectedSizeInCustom flag to hide the field.  Showing the field is the default action.
  409. noSetupFunctionSupplied/setupFunctionSupplied
  410. Specifies whether the Installer should call the setup function.  The type and ID of the setup function code resource must be entered in the setup function fields when the setupFunctionSupplied flag is specified.
  411. dontAllowServerAsTarget/dontAllowServerAsTarget
  412. Specifies whether the Installer should allow the user to install onto AppleShare volumes.  WARNING:  This flag is an unsupported and untested feature, and is available only as a courtesy to those developers that have hacked previous versions of the Installer to gain this functionality.  Only those scriptwriters that absolutely, positively, must allow their users to install onto AppleShare server volumes should use the allowServerAsTarget flag!  You should never, ever install anything into the volume’s System Folder! 
  413. Field descriptions
  414. Setup Function Code Resource Type
  415. The resource type of the setup function code resource.  This field is ignored unless the setupFunctionSupplied flag is specified.  The type is usually ‘infn’.  (4-bytes) 
  416. Setup Function Code Resource ID    
  417. The resource ID of the setup function code resource.  This field is ignored unless the setupFunctionSupplied flag is specified.  (2-bytes)
  418. Help Page    Four resource IDs of ‘PICT’ resources that make up one help page.  ( Four 2-byte values )
  419. Recommended Target Folder Name
  420. The recommended target folder name.  This can be specified at run-time by the scriptwriter in the setup function. As with any file name, the length should be limited to 31 characters, although the Installer will truncate the string if too long.  (even-padded Pascal string)
  421. Data Structures
  422. The setup function is a code resource specified in the preference resource that is passed a pointer to a parameter block with information about the Installer’s environment.  The entry point of this code resource must have the interface:
  423. OSErr    EnvironmentSetupFunction( EnvironmentSetupPBPtr );
  424. Return the result code noErr to have the Installer continue as normal.  Return the result code kQuitInstallerNow to force the Installer to quit immediately.  Returning any other value will cause an error alert to be display before forcing the Installer to quit.
  425. The parameter block contains the Installer’s suggested target application folder and system disk.  The fields in the parameter block can be changed to override the suggested values.
  426. typedef  struct {
  427.  —>    ProcPtr            fCallBackProcPtr;
  428. <—>    FSSpec            fTargetFSSpec;
  429. <—>    short                fSystemVRefNum;
  430. } EnvironmentSetupPB, *EnvironmentSetupPBPtr;
  431. Field descriptions
  432. fCallBackProcPtr    A pointer to the Installer’s dispatch routine.  You’ll need to pass this field as a parameter to Installer function glue routines.
  433. fTargetFSSpec    Contains the Installer’s suggested target folder information.  You can choose to override this suggestion by changing any of the fields in the FSSPec structure.  If the useDiskTargetMode flag is specified in the preference resource, only the vRefNum field of fTargetFSSpec is used by the Installer.
  434. fSystemVRefNum    The fSystemVRefNum field contains the Installer’s recommended System Folder volume.  You can choose to override this suggestion by changing the value passed.  This field is ignored when using the useDiskTargetMode flag because the system disk must always be the same as the target disk.
  435.  
  436. Packages and Atoms
  437. This chapter describes how to use packages and atoms.
  438. About Packages (‘inpk’)
  439. The package is added to the Custom Install list using the AddCustomItem rule clause, and if selected when clicking the Install or Remove button, will be added to the list of packages to install/remove.  For an Easy Install, the Installer rule clause AddPackages is used to build up the list of packages that the Installer will use to perform the bulk of the installation.
  440. Using Packages
  441. Packages group atoms to make scripting easier, and to provide the hierarchical list in the Custom Install dialog.  The package contains a list of those atoms and other packages that should be installed or removed when the parent package is installed or removed.  
  442. Using Packages with Easy Install
  443. One of the goals of the Easy Install rules is to specify the packages that will be installed when the user clicks the Install button.  Your Easy Install rules should eventually call the AddPackages rule clause to specify the packages, and ultimately the atoms, to be installed.  During an easy installation, the Installer is only concerned with the parts list and the restart flag.  The other fields are currently used only in the Custom Install and Remove interface. 
  444. Using Packages with Custom Install and Remove
  445. Packages are the foundation for the selectable items the user can choose from in the Custom Install list.  Packages are included at the top-level of the list by calling the AddCustomItem rule clause from the Custom Install rules.  The specified packages will then be displayed in the list with any nested packages (with their showsOnCustom flag set) shown as selectable sub-packages.  It is then up to the user to select the desired packages and click the Install or Remove button.
  446. To aid the user in deciding which items to select, an optional Get Info-style window can be supplied by scriptwriter that provides the icon, total size, version, date and information text.  To enable the Get Info window for the item, you need only to create a Package Comment resource (‘icmt’) and reference this from the package.
  447. Atom Execution Order
  448. Once the user clicks the Install or Remove button all specified packages are decomposed into a flat list of atoms.  Therefore, the order the Installer executes the atoms is unrelated to their position in the package’s part list.  Prior to installation the Installer groups File, Resource, Font, ResMerge, and Folder Atoms based on the source disk they reference.  Those atoms that do not need source disks (atoms that delete on install) are grouped together.  
  449. For each source disk the Installer executes the atoms in the following order:
  450. n    Folder Atoms.
  451. n    File Atoms.  This allows you to overwrite a file copied with a Folder Atom on the same or previous source disk.
  452. n    ResMerge Atoms.  This allows you to add or replace additional resources to a file copied on the same or previous source disk.
  453. n    Resource Atoms.  This allows you to add or replace a resource in a file copied with a Folder, File or ResMerge Atom on the same or previous source disk.
  454. n    Font Atoms.
  455. Although the Installer will consistently order the atoms of a specific type, the scriptwriter should never depend on this ordering, except for Action Atoms which are always guaranteed to be ordered by their ‘inaa’ resource ID.  
  456. To ensure that the source disks will always be copied in the same order, include a Disk Order resource (‘indo’) in your script.
  457. Package Reference
  458. Package Resource Description
  459. Packages have an 'inpk' resource type.  Its template is shown below.
  460. #define    PackageFlags                            \
  461.     boolean    doesntShowOnCustom, showsOnCustom;     \
  462.     boolean    notRemovable, removable;        \
  463.     boolean    forceRestart, dontForceRestart;    \
  464.     fill bit[13]    /* Reserved */
  465. type 'inpk' {
  466.     switch {
  467.         case format0:
  468.             key integer = 0;                /* Package Format version */
  469.             PackageFlags;                    /* Package Flags */
  470.             unsigned integer;                /* Package Comment Rsrc ID */
  471.             unsigned longint;                /* Package Size */
  472.             EvenPaddedString;                /* Package Name */
  473.             unsigned integer = $$CountOf(PartsList);    
  474.             wide array PartsList {        /* Parts List */
  475.                RsrcType;                    /* Part Type */
  476.                RsrcID;                        /* Part ID */
  477.             };
  478.     };
  479. };
  480. Flag descriptions 
  481. showsOnCustom/doesntShowOnCustom     
  482. Determines if the package should be displayed in the Custom Install list. 
  483. removable/notRemovable     Determines if the package should be added to the list of packages to be removed when the user has clicked the Remove button.  When used with the showsOnCustom flag, determines if the package is selectable in the Custom Remove list.  Note that you must also set the deleteWhenRemoving flag on any File, Resource or Font Atoms that are to be removed and you must set the actOnRemove flag in any Action Atoms that are to be called.
  484.     To include an package as a selectable item within Custom Remove, it is necessary to also include the package as a selectable item in Custom Install. There is no option to display a package as a selectable item in Custom Remove, but not in Custom Install. You may however choose to do nothing if the package is a selected item within Custom Install, and only act on that selected package during Custom Remove, but this may be confusing to the user.
  485. forceRestart/dontForceRestart 
  486. Determines if the Installer should force the user to restart their Macintosh after installing or removing this package when the currently active System Folder is a target.  Use the forceRestart flag if the installation requires rebooting to gain functionality, or if the package makes changes to the System file.
  487. Field descriptions 
  488. Package Comment Rsrc ID 
  489. The resource ID of a package comment resource that displays the package’s size, date, version and a brief description of its contents or what it does.  It’s recommended that every package shown in the Custom Install list have a comment resource.  If you do not wish to provide a package comment, place a zero in this field.  There are two types of comment resources.  The first, an ‘icmt’ resource, provides basic information in one resource.  The newer ‘inpc’ resource supports the RAM Size field and references a ‘TEXT’ resource that allows up to 32K of information text.  (2-bytes)
  490. Package Size     The size of all atoms and packages contained in this package.  This value is used to display in the comment window as well as provide the estimated selection size provided in Custom Install.  The Installer does not use this field to determine the actual disk space requirements of the target hard disk during preflighting.  Individual atom sizes are summed to determine if sufficient target disk space is available.  (4-bytes)
  491. Package Name     The name to be displayed in the Custom Install list.  (even-padded Pascal string)
  492.     If the Package Name field is a single dash character (-), a gray horizontal line appears in the list of packages.  This dash line is similar to the one found for menu resources.  This line can be used to separate the items which can be installed into logical groups.  If a package is used just for displaying a separation line, all of the other fields are ignored. 
  493.     Below is a sample gray-line package:  
  494.     resource 'inpk' (1, "dashed line") {
  495.     format0 {
  496.         showsOnCustom,
  497.         notRemovable,
  498.         dontForceRestart,
  499.         0,    /* Pkg Cmnt Rsrc ID */
  500.         0,    /* Package size */
  501.         "-",    /* Package Name */
  502.         {} /* empty brackets */
  503.     }
  504. };
  505. Part List     The type and resource ID of each part contained in this package.  (4-bytes + 2-bytes for each list item)
  506. Package Comment Resource Description
  507. Visible packages should reference one of two comment resources to provide additional information to the user about the packages they might want to install or remove.  The older ‘icmt’ is supported, but cannot specify the RAM Size field.  The new ‘inpc’ comment resource must reference a ‘TEXT’ resource that contains the text to display at the bottom of the package info window.  Both templates are described below.
  508. New Package Comment Resource Description
  509. type 'inpc' {                                * New Custom Item comment */
  510.         switch {
  511.             case format1:
  512.                 key integer = 1;            /* Custom Item Format version */
  513.                 unsigned hex longint;    /* Custom Item Date */
  514.                 unsigned hex longint;    /* Custom Item Version */
  515.                 unsigned hex longint;    /* Custom Item RAM Requirements */
  516.                 rsrcID;                        /* Custom Item Icon ID */
  517.                 rsrcID;                        /* Custom Item Desc. ('TEXT' ID)*/
  518.         };
  519. };
  520. Field descriptions 
  521. Custom Item Date     The release date of the package.  The value is specified in seconds since January 1, 1904.  The Installer uses the IUDateString toolbox call to get the string to display.  See Inside Macintosh Volume II, page 377 and Inside Macintosh Volume I, page 504.  (4-bytes)
  522. Custom Item Version     The version number of this package.  The Installer can decipher two version formats:
  523.     Binary coded decimal number.  The ones digit is the secondary revision (0 to 9), the tens digit is the primary revision (0 to 9), and all greater digits make up the version number.  For example, 100 is version 1.0, 290 is version 2.9, 605 is version 6.0.5, and 5704 is version 57.0.4.  The Installer knows this format because it will always be less than 10000.  (4-bytes)
  524.     ‘vers’ resource hexadecimal number.  See the definition of ‘Version’ in the “InstallerTypes.r” file.  (4-bytes)
  525. Custom Item RAM Requirements     
  526. The estimated RAM needs of this package.  The Installer displays this value in the package information window.  (4-bytes)
  527. Custom Item Icon ID     The ID of the appropriate ICON, ICN#, icl4 and/or icl8 resources. The ID must be 1024 or greater (IDs below this range are reserved).  If the script contains these icons, the appropriate one is displayed in the upper left corner of the package information window.  (2-bytes)
  528. Custom Item Description     
  529. The ID of a ‘TEXT’ resource containing the text to appear in the comment section of the package information window.  It should describe the package and provide any information that will help the user decide if installing or removing the package is appropriate.  Styled text is not currently supported.  (2-bytes)
  530. Old Package Comment Resource Description
  531. type 'icmt' {                
  532.         unsigned hex longint;    /* Release Date */
  533.         unsigned hex longint;    /* Version Number*/
  534.         RsrcID;                        /* Icon ID */
  535.         EvenPaddedString;            /* Package Comment Text */
  536. };
  537. Field descriptions 
  538. Release Date     The release date of the package.  The value is specified in seconds since January 1, 1904.  The Installer uses the IUDateString toolbox call to get the string to display.  See Inside Macintosh Volume II, page 377 and Inside Macintosh Volume I, page 504.  (4-bytes)
  539. Version Number     The version number of this package.  The Installer can decipher two version formats:
  540.     Binary coded decimal number.  The ones digit is the secondary revision (0 to 9), the tens digit is the primary revision (0 to 9), and all greater digits make up the version number.  For example, 100 is version 1.0, 290 is version 2.9, 605 is version 6.0.5, and 5704 is version 57.0.4.  The Installer knows this format because it will always be less than 10000.  (4-bytes)
  541.     ‘vers’ resource hexadecimal number.  See the definition of ‘Version’ in the “InstallerTypes.r” file.  (4-bytes)
  542. Icon ID     The ID of the appropriate ICON, ICN#, icl4 and/or icl8 resources. The ID must be 1024 or greater (IDs below this range are reserved).  If the script contains these icons, the appropriate one is displayed in the upper left corner of the Package Comment window.  (2-bytes)
  543. Package Comment Text     The text which appears in the comment section of the Package Comment.  It should describe the package and provide any information that will help the user decide if installing or removing the package is appropriate.  (even-padded Pascal string)
  544. About the File Atom
  545. The File Atom should be used to copy or delete one or both forks of a file.  Two versions of the File Atom script resource are understood by Installer 4.0, but it is recommended that you use format version 1.
  546. The File Atom provides the following major features for copying or deleting files:
  547. n    Ability to update a file only if it already exists.
  548. n    Ability to preserve an existing file.
  549. n    Ability to preserve a newer file based on its creation date, ‘vers’ 1 resource or custom code you write.
  550. n    Decompression of a file during installation.
  551. n    Automatically unlock the file before replacing or deleting, and/or lock the file when the installation is finished.
  552. n    Install a file that has been split among multiple source disks.
  553. If you are simply copying hundreds of uncompressed files and do not wish to create separate Files Atoms for each, you might be able to use a Folder Atom instead.
  554. Using the File Atom (‘infa’)
  555. The new version of the File Atom provides for large source files to be split across installation disks, then joined into one file on the target disk during the installation.  In addition, compressed source files can be decompressed during the installation using an Atom Extender.
  556. Comparing Files by Version
  557. Two new fields in the File Atom allow the scriptwriter to compare the source and target file using their version number, instead of only using their creation date.  The first field holds the source file’s version number, and the second field holds the resource ID of a new Version Compare (‘invc’) script resource.  The Version Compare script resource allows the scriptwriter to call a code resource that calculates the version number of the target file. 
  558. To compare the newness of the target and source using the old creation date method, use the useSrcCrDateToCompare flag.  To compare using the version number in the target’s ‘vers’ ID=1 resource then use the useVersProcToCompare flag and place a 0 (zero) in the Version Compare Rsrc ID field.  If the version number is stored somewhere besides the ‘vers’ ID=1 resource then you’ll need to create and attach a Version Compare script resource to the File Atom.
  559. Using either the useSrcCrDateToCompare or useVersProcToCompare flag presents the identical interface to the user if the source file is older than the target file.  See the description of the leaveAloneIfNewer flag in the “File Atom Reference” section.
  560. Using Split Sources with File Atoms
  561. The new ‘infa’ script resource contains a source list that holds zero or more references to source files.  If the original source file must be split into smaller files, an entry for each split source piece should be placed into the source list.  Each entry contains information about the location of the source file (‘infs’ ID), the target size of the resource fork piece and the target size of the data fork piece.
  562. Each target size field must contain the exact size the source piece will appear in the target file.  If the piece is being decompressed with an Atom Extender during installation, then this field must contain the uncompressed size of the piece. If only one fork is requested to be copied, the target size field of the other fork is ignored.  Place a zero in a fork’s target size field if the fork contains no data.
  563. NOTE
  564. The order of the entries in the source list is important.  Each piece will be written to the target file in the same order as it appears in the list. u
  565. Using Atom Extenders with File Atoms
  566. Using Atom Extenders with the new File Atom (Format 1) allows scriptwriters to easily decompress files that have been compressed on the source installation disk.  Attach the Atom Extender to the File Atom file by entering the ID of the ‘inex’ script resource into the appropriate field in the ‘infa’.  The code resource referenced from the ‘inex’ script resource will be called at the desired point in the installation so it can read the compressed file data, decompress the data, then write it to the target file.
  567. NOTE
  568. You should never create a source file that has a compressed resource fork, because any attempt to access the resource fork by the Finder or other application may crash the Macintosh.  The rsrcForkInRsrcFork/rsrcForkInDataFork flag has been added to designate where the resource fork is stored.  Use the rsrcForkInDataFork flag when copying a compressed resource fork that is stored in the data fork of the source file.  Use the rsrcForkInRsrcFork flag when copying a non-compressed resource fork. u
  569. When the Installer is preparing to install, each File Atom is expanded into one or more parts.  As each part is installed, the Atom Extender attached to the original File Atom will be called for each part.  When only one source file is specified there is one part for each fork being copied.  When split source pieces are specified there is one part for each fork being copied from each piece.
  570. The goal of the new File Atom and Atom Extender is to provide compatibility with most popular compressed source file configurations.  Several configurations are listed below.  
  571. n    The simplest source file configuration is for each compressed fork to be placed into the data fork of two separate files.  The Installer will call the Atom Extender separately for each fork.
  572. n    Another source file configuration places both forks into the same data fork of a source file, with a header describing the format of the data.  The Atom Extender will be called once for each fork copied, but will be responsible for finding, reading and writing the correct data for the specified fork.  The Atom Extender parameter block will provide information about which fork is being copied.
  573. n    An “Archived” source file configuration contains multiple compressed files (and forks) in one source file.  One File Atom must be created for each target file being copied, with each referring to the same source file (‘infs’). The Atom Extender parameter block will contain information about the current file (and fork) being copied, with which the Atom Extender will find, read, decompress and write the proper target file’s data.  Our InstaCompOne Atom Extender is an example of this approach.
  574. For those source configurations that cannot be accommodated by the built-in routines, scriptwriters can use the supplied parameter block to perform the copy by themselves.  This strategy should only be taken when absolutely necessary.
  575. Installing a Custom Folder Icon 
  576. The File Atom can easily be used to set the custom icon of any folder on the target disk.  The Installer notices if the scriptwriter is copying the special invisible “Icon\n” file, and if so automatically sets the userCustomIcon bit on its parent folder.
  577. There are several key points to remember when installing a custom icon:
  578. n    Since the Installer does not remove the special “Icon\n” file correctly, use the dontDeleteWhenRemoving flag to prevent its removal. 
  579. n    It’s polite to preserve an existing custom icon, so use the copyIfUpdate flag.
  580. n    The Installer will install the custom icon even if the directory  is the root level of the hard disk.  We discourage scriptwriters from recommending the root level of the hard disk as the target folder, but user’s can select it if they choose.
  581. File Atom Reference
  582. This section describes the resource description of the ‘infa’ resource, format 1.
  583. Resource Description
  584. #define    fileAtomFlags                                                            \
  585.         boolean        dontDeleteWhenRemoving, deleteWhenRemoving;        \
  586.         boolean        dontDeleteWhenInstalling, deleteWhenInstalling;    \
  587.         boolean        dontCopy, copy;                                            \
  588.         fill bit[3]    /* Reserved */                                                \
  589.         boolean        dontIgnoreLockedFile, ignoreLockedFile;            \
  590.         boolean        dontSetFileLocked, setFileLocked;                     \
  591.         boolean        useSrcCrDateToCompare, useVersProcToCompare;     \
  592.         boolean        srcNeedExist, srcNeedNotExist;                         \
  593.         boolean        rsrcForkInRsrcFork, rsrcForkInDataFork;             \
  594.          boolean        updateEvenIfNewer, leaveAloneIfNewer;                \
  595.         boolean        updateExisting, keepExisting;                            \
  596.         boolean        copyIfNewOrUpdate, copyIfUpdate;                        \
  597.         boolean        noRsrcFork, rsrcFork;                                    \
  598.         boolean        noDataFork, dataFork                
  599. type 'infa' {
  600.         switch {
  601.             case format1:
  602.                 key integer = 1;                    /* File Atom version */
  603.                 fileAtom1Flags;                    /* File Atom Flags */
  604.                 unsigned longInt;                    /* Total Target File Size */
  605.                 unsigned integer;                    /* Finder Attribute Flags */
  606.                 fileSpecID;                            /* Tgt file spec ID */
  607.                 integer = $$CountOf (Pieces);    /* Number of Source Pieces */
  608.                 wide array Pieces {
  609.                     fileSpecID;                    /* Source File Spec*/
  610.                     unsigned longInt;            /* Target Data Fork Part Size */
  611.                     unsigned longInt;            /* Target Rsrc Fork Part Size */
  612.                 };
  613.                 unsigned longint;                /* Source Version Number */
  614.                 rsrcID;                            /* Version Compare Rsrc ID */
  615.                 rsrcID;                            /* Atom Extender Rsrc ID */
  616.                 evenPaddedString;                /* Atom Description */
  617.         };
  618. };
  619. Flag Descriptions
  620. deleteWhenRemoving/dontDeleteWhenRemoving    
  621. Determines if the file is deleted during a removal.  When using the deleteWhenRemoving flag, if the target file exists and the user clicks Remove, the target file is deleted.  If the file does not exist on the target disk, this flag is ignored.  The file atom must be part of a package that uses the removable flag.  Note that of the following File Atom flags, only the rsrcFork/noRsrcFork and dataFork/noDataFork flags have any effect on the removal process.
  622. deleteWhenInstalling/dontDeleteWhenInstalling
  623. Determines if a file is deleted during an installation when using the dontCopy flag.  Installer generally ignores this flag when using the copy flag.  When using the deleteWhenInstalling flag, after the user clicks Install, the target file is deleted if it exists, otherwise the flag is ignored.  The deleteWhenInstalling flag is primarily used for deleting previously installed files that are no longer needed.
  624. copy/dontCopy    Determines if the file is copied during an installation.  Note that some flags (leaveAloneIfNewer, keepExisting, copyIfUpdate) can prevent copying from happening under the circumstances specified.  
  625. dontIgnoreLockedFile/ignoreLockedFile
  626. Determines if an existing locked target file should be automatically unlocked before replacing.  Only use the ignoreLockedFile flag if you originally installed the file locked or your software locks the file.  Use the dontIgnoreLockedFile flag the majority of times to preserve the user’s control over their Macintosh.
  627. dontSetFileLocked/setFileLocked
  628. Determines if the target file should be locked after copying.  Use setFileLocked to request that the target file be locked at the end of the installation.
  629. useSrcCrDateToCompare/useVersProcToCompare
  630. Determines how the Installer will determine if the target file is newer or older than the source file.  If using the useSrcCrDateToCompare flag the creation date entered in the Source File Spec is compared with the creation date of the target file.  If the useVersProcToCompare flag is used, an optionally supplied version function is called to determine the version number of the target file.  See the description of the Version Compare Rsrc ID field.
  631. srcNeedExist/srcNeedNotExist
  632. Determines whether the source file must exist on the source disk.  Use srcNeedNotExist if the source file can optionally reside on the source disk.  If the file is not found the atom is ignored and the installation continues.
  633. rsrcForkInRsrcFork/rsrcForkInDataFork
  634. Since a compressed resource fork should never be left in the resource fork of the source file, this allows the scriptwriter to easily store the compressed resource fork in the data fork.  These flags determine where the resource fork data will be read from when using the ReadSourceData() routine.  If the rsrcForkInDataFork flag is specified, the source data will actually be read from the data fork.
  635. leaveAloneIfNewer/updateEvenIfNewer
  636. Determines what action the Installer should take if the target file is newer than the source file that is replacing it.  The method the Installer uses to determine the newness of the files is based on the useSrcCrDateToCompare and useVersProcToCompare flags.  Use the updateEvenIfNewer flag if the version of this file must be synchronized with specific versions of other files that are part of the installation.  The alert displayed to the user depends whether the user is performing an Easy Install or a Custom Install.
  637.     Easy Install  —  If using the leaveAloneIfNewer flag, the user will not be notified and the newer will be preserved.  If using the updateEvenIfNewer flag, an alert is shown that has two options:  Continue or Cancel.  Clicking Cancel will stop the installation, and clicking Continue will replace the newer target file with the older source file.
  638.     Custom Install  —  If using the leaveAloneIfNewer flag, the user will be presented with an alert that provides three choices:  Newer, Older or Cancel.  If using the updateEvenIfNewer flag, the alert is the same as for an Easy Install. 
  639. keepExisting/updateExisting
  640. Allows the scriptwriter to preserve an existing file when using the copy and/or deleteOnInstall flag.  This might be the case if you want to preserve a preference file that contains user specific data.  Use keepExisting to prevent the Installer from disturbing an existing target file.  No copying will occur if the updateExisting flag is used with the copyIfUpdate flag.
  641. copyIfUpdate/copyIfNewOrUpdate
  642. Allows the scriptwriter to update a file only if it already exists when used with the copy flag.  Use copyIfUpdate to prevent a new file from being created. If the copyIfUpdate flag is used with the keepExisting flag then no copying will occur.
  643. rsrcFork/noRsrcFork    Determines if the resource fork of the file is affected during an installation or removal.  Use resourceFork to copy or delete the entire resource fork of the file during an installation, or delete the entire resource fork during a removal.  Use noResourceFork to not touch the resource fork of the file.
  644. dataFork/noDataFork    Determines if the data fork of the file is affected during an installation or removal.  Use dataFork to copy or delete the entire data fork of the file during an installation, or delete the entire data fork during a removal.  Use noDataFork to not touch the data fork of the file.
  645. Field Descriptions
  646. Total Target File Size    The size in bytes of the file to be installed or deleted.  This field is only used by the Installer in figuring the disk size needed for an installation.  (4-bytes)
  647. Finder Attribute Flags
  648. These flags determine how Finder displays and manages user interaction with the file.  If you are using ScriptCheck 4.0, then this field is updated automatically (see ScriptCheck documentation for handling compressed source files), otherwise you must place the correct value in this field.  See Inside Macintoh, Volume VI, pages 9-36 - 9-38 for more information about these flags.  (2-bytes)
  649. Source File Spec. Rsrc ID
  650. The resource ID of a Source File Spec. (‘infs’) describing the source file where the data is stored.  If you’re just deleting a file and therefore don’t need a source file, enter 0 (zero) in this field.  (2-bytes)
  651. Target Data Fork Piece Size
  652. The number of bytes the data fork piece will occupy in the target file.  If the data fork is decompressed using an Atom Extender during the installation, then this value should be the original noncompressed size of the source piece.  The value is used to compute where multiple pieces are to be written into the final target file, and therefore must be exact.  If not copying the data fork, this field is ignored.  (4-bytes)
  653. Target Rsrc Fork Piece Size
  654. The number of bytes the resource fork piece will occupy in the target file.  If not copying the resource fork, this field is ignored.  If the resource fork is decompressed using an Atom Extender during the installation, then this value should be the original noncompressed size of the source piece.  The value is used to compute where multiple pieces are to be written into the final target file, and therefore must be exact.  (4-bytes)
  655. Source Version Number    The version number (BCD format) of the source file when using the useVersProcToCompare flag.  See Inside Macintosh:  Macintosh Toolbox Essentials, page 7-31 for a description of the version number format.  (4-bytes)
  656. Version Compare Rsrc ID    The resource ID of a Version Compare (‘invc’) script resource.  The resulting version number from the version function will be compared with the Version Number field to determine if the target is newer or older than the source.  If the resource ID is 0 (zero) and the useVersProcToCompare flag is used the Installer will default to comparing the Source Version Number field with the version number in the ‘vers’ ID=1 resource contained in the target file.  If no ‘vers’ ID=1 resource exists then the target version number is assumed to be 0 (zero).  (2-bytes)
  657. Atom Extender Rsrc ID    The resource ID of an Atom Extender (‘inex’ script resource).  (2-bytes)
  658. File Atom Description    The File Atom Description field is an even-padded Pascal string describing the atom.  This is used as part of the status dialog.  If you do not supply a description the Installer will display “Copying File: [file name]” or “Writing File: [file name].”  If you supply a description it will be appended to the string “Copying “ or “Writing “.
  659. About the Resource Atom (‘inra’)
  660. The Resource Atom should be used to copy or delete a single resources in a file.  Two versions of the Resource Atom script resource are understood by Installer 4.0, but it is recommended that you use format version 1.
  661. The Resource Atom provides the following major features for copying or deleting files:
  662. n    Ability to update a resource only if it already exists.
  663. n    Ability to preserve an existing resource.
  664. n    Ability to preserve a newer resource based on its version number that is determined by custom code you write.
  665. n    Decompression of the resource during installation.
  666. n    Installation of a resource that has been split among multiple resources on multiple source disks.
  667. If you must copy all the resources from a single source file and merge them with the target file you may want to consider using the ResMerge Atom.
  668. Using the Resource Atom
  669. Comparing Files By Version
  670. Two new fields in the Resource Atom allow the scriptwriter to compare the source and target resource based on the version number.  The first field holds the source file’s version number, and the second field holds the ID of a Version Compare (‘invc’) script resource.  The Version Compare script resource allows the scriptwriter to call a code resource that calculates the version number of the target resource.
  671. To compare the version number of the target resource to the source version number entered in the Resource Atom you’ll need to create and attach a Version Compare script resource to the Resource Atom.  Since setting and obtaining version number information for an individual resource is not a feature of the Resource Manager, extracting the version number from the target resource depends on how the resource encodes its version number.  Most examples of this use a header at the beginning of the resource to hold this type of information.
  672. Using Split Sources with Resource Atoms
  673. The format 1 version of the Resource Atom script resource contains a list of source entries.  If the original resource must be split into smaller resource pieces, an entry for each split source piece must be placed into the source list.  Each entry contains information about the location of the source file (‘infs’ ID), the source resource type, the source resource ID, the target size of the resource piece, and the source resource name.  The target size field must contain the exact size the source piece will appear in the target resource.  If the piece is being decompressed with an Atom Extender during installation, this field must contain the original uncompressed size of the piece. 
  674. When specifying more than one split resource piece, the Installer joins the pieces into a target resource in the order the sources are specified.  Generally, you’ll want to use ‘part’ for the type of source resources that have been split and/or compressed.  This prevents resources compressed using third-party schemes from being confused with the original resource, especially when using  tools like ResEdit and DeRez.
  675. Using Atom Extenders with Resource Atoms
  676. You’ll use an Atom Extender to decompress a resource that was compressed by you to save space on your source disks.  The Resource Atom is expanded into one or more parts that the Atom Extender receives with the kBeforePart and kAfterPart messages.  There will be one part for each source resource piece specified in the source list.  Since owned resources are always copied whole and are usually relatively small, the owner’s Atom Extender is never called when copying its owned resources.
  677. NOTE
  678. The compressed flag in the resource attributes should NOT be set on any source resource being decompressed using an Atom Extender.  This flag is presently reserved for use by Apple Computer, Inc. u
  679. Resource Atom Reference
  680. This section describes the resource description of the ‘inra’ resource, format 1.
  681. Resource Description
  682. #define    resourceAtomFlags                                                        \
  683.         boolean        dontDeleteWhenRemoving, deleteWhenRemoving;        \
  684.         boolean        dontDeleteWhenInstalling, deleteWhenInstalling;    \
  685.         boolean        dontCopy, copy;                                            \
  686.         fill bit[6];                                /* Reserved    */                \
  687.         boolean        noTgtRequired, tgtRequired;                            \
  688.         boolean        updateExisting, keepExisting;                            \
  689.         boolean        copyIfNewOrUpdate, copyIfUpdate;                        \
  690.         boolean        dontIgnoreProtection, ignoreProtection;            \
  691.         boolean        srcNeedExist, srcNeedNotExist;                        \
  692.         boolean        byName, byID;                                                \
  693.         boolean        nameNeedNotMatch, nameMustMatch        
  694. type 'inra' {
  695.         switch {
  696.             case format1:
  697.                 key integer = 1;                /* Resource Atom Format vers */
  698.                 resourceAtomFlags;            /* Resource Atom Flags */
  699.                 unsigned longInt;                /* Total Target Size    */
  700.                 fileSpecID;                        /* Target File Spec */
  701.                 rsrcType;                        /* Target Resource Type */
  702.                 rsrcID;                            /* Target Resource ID */
  703.                 integer;                            /* Target Resource Attributes */
  704.                 evenPaddedString;                /* Target Resource Name */
  705.                 integer = $$CountOf (Parts);    /* Number of Pieces */
  706.                 wide array Parts {
  707.                     fileSpecID;                        /* Source Piece File Spec */
  708.                     rsrcType;                        /* Source Piece Type    */
  709.                     rsrcID;                            /* Source Piece Rsrc ID */
  710.                     unsigned longInt;                /* Target Piece Size    */
  711.                     evenPaddedString                /* Source Piece Rsrc Name */
  712.                 }
  713.                 unsigned longint;                /* Source Version Number */
  714.                 rsrcID;                            /* Version Compare Rsrc ID */
  715.                 rsrcID;                            /* Atom Extender Rsrc ID */
  716.                 evenPaddedString;                /* Atom Description */
  717.         };
  718. };
  719. Flag Descriptions
  720. deleteWhenRemoving/dontDeleteWhenRemoving    
  721. Determines if the resource is deleted during a removal.  When using the deleteWhenRemoving flag, if the target resource exists and the user clicks Remove, the target resource is deleted.  If the resource does not exist on the target disk, this flag is ignored.  Note that the Resource Atom must be part of a package that uses the removable flag. 
  722. deleteWhenInstalling/dontDeleteWhenInstalling
  723. Determines if the resource is deleted during an installation when using the dontCopy flag.  When using the deleteWhenInstalling flag, after the user clicks Install, the target resource is deleted if it exists, otherwise the flag is ignored.  The deleteWhenInstalling flag is primarily used for deleting previously installed resources that are no longer needed.  Note that some flags (leaveAloneIfNewer, keepExisting) can prevent deletion from happening under the circumstances specified.  
  724. copy/dontCopy    Determines if the resource is copied or not during an installation.  Note that some flags (leaveAloneIfNewer, keepExisting, copyIfUpdate) can prevent copying from happening under the circumstances specified.  
  725. leaveAloneIfNewer/updateEvenIfNewer
  726. Determines what action the Installer should take if the target resource is newer than the source resource that is replacing it.  The scriptwriter must write a code resource that determines the version number by referencing the resource ID of a Version Compare (‘invc’) script resource.  Use the leaveAloneIfNewer flag to prevent the older source resource from replacing the newer target resource during an installation.  Unlike the File Atom, the user is not given a chance to override the result of this flag.  Use the updateEvenIfNewer flag if the version of this resource must be synchronized with specific versions of other files or resources that are part of the installation.
  727. tgtRequired/noTgtRequired
  728. The target file for this resource must already exist.  If the target file does not exist, the user is warned that a target file is needed.  (For example, AppleShare installs resources into the System file, but if there is no system file, the Installer alerts the user, rather than creating a System file which has only the AppleShare resources in it.)  When using the noTgtRequired flag and the target file does not exist, the Installer will create one.
  729. keepExisting/updateExisting
  730. Allows the scriptwriter to preserve an existing resource when using the copy and/or deleteOnInstall flag.  This might be the case if you want to preserve a preference resource that contains user specific data.  Use keepExisting to prevent the Installer from disturbing an existing target resource.  No copying will occur if the updateExisting flag is used with the copyIfUpdate flag.
  731. copyIfUpdate/copyIfNewOrUpdate
  732. Allows the scriptwriter to update a resource only if it already exists.  Use the copyIfUpdate flag to prevent a new resource from being created.  If the copyIfUpdate flag is used with the keepExisting flag then no copying will occur.
  733. ignoreProtection/dontIgnoreProtection
  734. Determines if the user should be alerted if any resource with its protected bit set will be replaced or deleted.  When using the ignoreProtection flag the resource is deleted from or updated in the target file even if it is protected in the target file.
  735. srcNeedExist/srcNeedNotExist
  736. Determines whether the source resources must exist on the source disk.  Use the srcNeedNotExist flag if the source resources can optionally reside on the source disk.  If the source file or source resources are not found, the atom it is ignored and the installation continues normally. 
  737. byID/byName    Determines how the resource should be found in the source and target files. If using the byID flag the resource is found in the source and target file using only the ID.  If you want to require the resource name to match as well then use the nameMustMatch flag.  If using the byName flag the resource is found in the source and target file using only the name specified in the Resource Name field.  Use the byName flag when installing Desk Accessory resources in pre-7.0 System files.
  738. nameMustMatch/nameNeedNotMatch
  739. Specifies that the resource found in the source file using its ID have the name in the Resource Name field.  The resource with the same name and ID in the target file, if any, will be replaced or deleted (if the updateExisting flag is used).  This flag is ignored if the byName flag, above, is used.  If using the nameNeedNotMatch flag the byID flag must also be used.
  740. Field Descriptions
  741. Total Target Size    The size in bytes of the copied target resource and all its owned resources.  This field is used only by the Installer in figuring the disk size needed for an installation.  (4-bytes) 
  742. Target Resource File Spec.
  743. The resource ID of a Target File Spec script resource (‘intf’, or ‘infs’ for pre-4,0 scripts) describing the file on the target disk where the resource will be deleted, created, or updated.  (2-bytes) 
  744. Target Resource Type    The resource type the Installer will use to find or create the resource in the target file.  (4-bytes) 
  745. Target Resource ID    The resource ID the Installer will use to find or create the resource in the target file.  If the ID of the resource doesn’t matter and you’re copying using the byName flag (e.g., most Desk Accessories), this field should be 0, in which case the Installer picks an ID for the resource in the target file.  (2-bytes) 
  746. Target Resource Attributes
  747. The attributes that will be given to the target resource when copying.  (2-bytes) 
  748. Target Resource Name    The name that will be given to the target resource.  If this string is empty, the name of the first source resource will be given to the target resource.  (even-padded Pascal string) 
  749. Source Piece File Spec.    The resource ID of a Source File Spec. (‘infs’) describing the source file that holds the resource part.  If you’re just deleting a resource and therefore don’t need a source file, leave the source list empty.  (2-bytes)
  750. Source Piece Type    The resource type of the resource piece being copied.  If there is more then one piece, it’s recommended that the type by ‘part’.  (4-bytes) 
  751. Source Piece ID    The resource ID of the resource piece being copied.  This field is ignored if the resource piece is being found by name (byName flag is used).  (2-bytes) 
  752. Target Piece Size    The number of bytes the resource piece will occupy in the target file.  If the resource will be decompressed using an Atom Extender, then this value should be the noncompressed size of the source piece.  This value is used to compute where multiple pieces are to be written in the final target file, and therefore must be exact.  (4-bytes) 
  753. Source Piece Resource Name
  754. The name of the source resource.  This field is only needed when finding the source resource by its resource name (byName flag is used).  (even-padded Pascal string)
  755. Source Version Number    The version number (BCD format) of the source resource when a Version Compare function is used to calculate the target version number.  (4-bytes)
  756. Version Compare Rsrc ID    The resource ID of a Version Compare (‘invc’) script resource.  The resulting version number from the version function will be compared with the Source Version Number field to determine if the target is newer or older than the source.  If this field is 0 (zero) then the target version number is assumed to be 0 (zero).  (2-bytes)
  757. Atom Extender Rsrc ID    The resource ID of an Atom Extender (‘inex’) script resource.  This Atom Extender will be called during copying of each resource part.  (2-bytes)
  758.     When using InstaCompOne compression enter a value of 241 here.
  759. Resource Atom Description    
  760.     The Resource Atom Description field is an even-padded Pascal string describing the atom.  This is used as part of the status dialog.  If you do not supply a description the Installer will display “Building File: [file name]” or “Writing File: [file name].”  If you supply a description it will be appended to the string “Building “ or “Writing “.
  761. About the Resource List Atom (‘inr#’)
  762. The Resource List Atom is a unique atom that provides a more compact storage structure with slightly reduced functionality for installing resources.  This enables scriptwriters to copy thousands of individual resources without the overhead of thousands of Resource Atom resources in their script file.  For installation of less than a 100 resources, most scriptwriters should continue using individual Resource Atoms.
  763. Using the Resource List Atom
  764. The Resource List Atom is actually an array of individual Resource Atom records.  The records are of a fixed size, so some options available in format 1 of the Resource Atom are not available in the Resource List Atom. 
  765. Use format1 Resource Atoms instead of the Resource List Atom if you need any of the following features: 
  766. n    Find a source resource based on its name.
  767. n    Copy a resource that is split across multiple files.
  768. n    Specify a target resource name. 
  769. n    Use with InstaCompOne decompression Atom Extender. 
  770. n    Change the type or ID during installation.  The Resource List Atom requires the target resource type and ID to be the same as the source resource type and ID.
  771. Referencing Resource Atom Lists from Packages
  772. Unlike other atoms, Resource Atom Lists are not referenced using their own atom type (‘inr#’).  Instead, packages should reference the atom type ‘inra’ and the ID entered in the Resource ID field of the resource atom record inside the Resource Atom List array.  When an ‘inra’ is found referenced from a package, the Installer first looks for a Resource List Atom (‘inr#’) resource, and if not found looks for an actual resource of type ‘inra’ and the specified ID in script file.  When the Resource List Atom resource is found, the Installer searches through the list looking for a resource record that matches the requested resource ID.  The Resource ID field in the record holds a 2-byte value that you create.
  773. Resource List Atom Reference
  774. This section describes the resource description of the ‘inr#’ resource, format 0.
  775. Resource Description
  776. type 'inr#' {
  777.         switch {
  778.             case format0:
  779.                 key integer = 0;        /* Resource Atom Format version */
  780.                 integer = $$CountOf (inraRsrcs);    /* Number of inraRsrcs */
  781.                 wide array inraRsrcs {
  782.                     integer;                            /* Resource ID    */
  783.                     resourceAtomFlagsFormat1;    /* Resource Atom Flags */
  784.                     unsigned longInt;                /* Total Target Size    */
  785.                     fileSpecID;                        /* Target File Spec */
  786.                     fileSpecID;                        /* Source File Spec */
  787.                     rsrcType;                        /* Src/Tgt Rsrc Type */
  788.                     rsrcID;                            /* Src/Tgt Rsrc ID */
  789.                     integer;                            /* Tgt Rsrc Attributes */
  790.                     unsigned longint;                /* Source Version Number */
  791.                     rsrcID;                            /* Version Compare Rsrc ID */
  792.                     rsrcID;                            /* Atom Extender ID */
  793.                     unsigned longInt;                /* Target Size of Rsrc */
  794.                 };
  795.         };
  796. };
  797. Flag Descriptions
  798. The flags for the Resource List Atom are identical to format 1 of the Resource Atom.  Since there is no source name field in the Resource List Atom you should always use the byID and nameNeedNotMatch flags. 
  799. Field Descriptions
  800. Resource ID    The ID value that will be used to find this record from the reference in a package.  For example, if you choose the ID value of 369, then the reference from a package should have the type ‘inra’ and the ID 369.  (4-bytes) 
  801. Total Target Size    The size, in bytes, of the copied target resource and all its owned resources.  This field is only used by the Installer for calculating the disk size needed for an installation.  (4-bytes) 
  802. Target File Spec.    The resource ID of a Target File Spec script resource (‘intf’, or ‘infs’ for pre-4,0 scripts) describing the file on the target disk where the resource will be deleted, created, or updated.  (2-bytes) 
  803. Source File Spec.    The resource ID of a Source File Spec. (‘infs’) describing the source file that holds the source resource.  If you’re just deleting a resource and therefore don’t need a source file, place a 0 (zero) in this field.  (2-bytes)
  804. Src/Tgt Resource Type    The resource type the Installer will use to find the resource in the target and source file.  If the resource must be created in the target file it will be given this type.  (4-bytes) 
  805. Src/Tgt Resource ID    The resource ID the Installer will use to find the resource in the target and source file.  If the resource must be created in the target file it will be given this ID.  (2-bytes) 
  806. Target Resource Attributes
  807. The attributes that will be given to the target resource when copying.  (2-bytes) 
  808. Source Version Number    The version number (BCD format) of the source resource when a Version Compare function is used to calculate the target version number.  (4-bytes)
  809. Version Compare Rsrc ID    The resource ID of a Version Compare (‘invc’) script resource.  The resulting version number from the Version Compare function will be compared with the Source Version Number field to determine if the target is newer or older than the source.  If this field is 0 (zero) then the target version number is assumed to be 0 (zero).  (2-bytes)
  810. Atom Extender Rsrc ID    The resource ID of an Atom Extender (‘inex’) script resource.  This Atom Extender will be called during copying of each resource.  (2-bytes)
  811. Target Size    The size in bytes of the copied target resource item.  This field is used only by the Installer in figuring the disk size needed for an installation.  (4-bytes) 
  812. About the Font Atom (‘inff’)
  813. The Font Atom is used to describe a set of font strikes (size/style) from a specified font family which should be copied to or removed from a file.  Two versions of the Resource Atom script resource are understood by Installer 4.0, but it is recommended that you use format version 1.
  814. The Font Atom provides the following major features for copying or deleting fonts:
  815. n    Ability to preserve an existing font strike.
  816. n    Ability to specify an individual strike to copy/delete or simple mode that copies the complete family.
  817. n    Support for installing into all versions of System Software with a single Font Atom.
  818. n    Decompression of font resources (‘NFNT’, ‘sfnt’ or ‘FONT’) during installation.
  819. n    Installation of a font strike that has been split among multiple resources on multiple source disks.
  820. Using the Font Atom
  821. Auto-Routing Under Pre-7.1 Systems
  822. To overcome the effort involved with installing fonts into the various versions of System Software, the Installer will automatically place the font resources into the System file if installing into a System Folder that does not support the “Fonts” folder.  To use this feature, write your script to always install into a file in the System Folder’s “Fonts” folder.  Make the target file path start with the reserved folder name “special-font” and reference this target file spec. from the Font Atom, and the Installer will handle the rest.
  823. NOTE
  824. System Software installation scriptwriters should understand how the Installer decides where the font resources will be installed to avert disasters, and bugs.  The Installer uses the version of the target System file and the existence of a Resource Atom installing the ‘fld#’ resource to decide whether to auto-route or not.  You must be installing a ‘fld#’ resource into a pre-7.1 System file at the same time as the fonts to let the Installer know you are upgrading to System 7.1 or newer. u
  825. Using Atom Extenders with Font Atoms
  826. You’ll use an Atom Extender to decompress font resources that were compressed by you to save space on your source disks.  Minor constraints are required when using the Font Atom with this feature.
  827. Scriptwriters must specify individual strikes(size and style) to copy when using an Atom Extender to decompress font resources.  This is required because the target piece sizes for each strike must be entered in the optional source list.  It’s recommended to place compressed font resource data into resources of type ‘part’.  
  828. The Font Atom is expanded into one or more parts that the Atom Extender receives with the kBeforePart and kAfterPart messages.  As each part is installed, the Atom Extender attached to the original Font Atom will be called for each part.  There will be a part for each source resource piece being copied.  The only exception to this rule is for strikes that reference font resources in ROM.  Since there is no data copied for these strikes the Atom Extender is not called.
  829. NOTE
  830. The ‘FOND’ resource is always copied using the Installer’s default copy mechanism.  This prevents the scriptwriter from decompressing the ‘FOND’ resource using an Atom Extender.  The ‘FOND’ resource is the road map to other font resources (‘FONT, ‘NFNT’, and ‘sfnt’), and therefore must never be compressed.  We suggest that you convert the ‘FOND’ resource into the type ‘iFND’ and use the encodedFONDRsrc  flag when compressing any of the font resources it references.  This will prevent the system software from becoming confused when finding a ‘FOND’ resource in your source file that may reference not existent font resources.  In addition, the compressed flag should NOT be set in the resource attributes of the ‘part’ resource because this flag is presently reserved for use by Apple Computer, Inc. u
  831. Font Atom Reference
  832. This section describes the resource description of the ‘inff’ script resource, format 1.
  833. Resource Description
  834. #define    Style                                                                        \
  835.     fill bit[9];                                            /* Reserved */        \
  836.     Boolean    noExtendedStyle, extendedStyle;    /* Extended style */\
  837.     Boolean    noCondensedStyle, condensedStyle;/* Condensed style */\
  838.     Boolean    noShadowStyle,     shadowStyle;    /* Shadow style */    \
  839.     Boolean    noOutlineStyle, outlineStyle;        /* Outline style */    \
  840.     Boolean    noUnderlineStyle, underlineStyle;/* Underline style */\
  841.     Boolean    noItalicStyle, italicStyle;        /* Italic style */    \
  842.     Boolean    noBoldStyle, boldStyle;                /* Bold style */
  843. #define fontFamilyAtomFlags                                                    \
  844.         boolean        dontDeleteWhenRemoving, deleteWhenRemoving;        \
  845.         boolean        dontDeleteWhenInstalling, deleteWhenInstalling;    \
  846.         boolean        dontCopy, copy;                                            \
  847.         fill bit[5]                                        /* Reserved */            \
  848.         boolean        noEncodedFONDRsrc, encodedFONDRsrc;                    \
  849.         boolean        noTgtRequired, tgtRequired;                            \
  850.         boolean        updateExisting, keepExisting;                            \
  851.         boolean        copyIfNewOrUpdate, copyIfUpdate;                        \
  852.         boolean        dontIgnoreProtection, ignoreProtection;            \
  853.         boolean        srcNeedExist, srcNeedNotExist;                        \
  854.         boolean        byName, byID;                                                \
  855.         boolean        nameNeedNotMatch, nameMustMatch
  856. #define    RsrcSpec                                                                    \
  857.         fileSpecID;                    /* Source Piece File Spec. */            \
  858.         rsrcType;                    /* Source Piece Rsrc Type    */            \
  859.         rsrcID;                        /* Source Piece Rsrc ID */                \
  860.         unsigned longInt;            /* Source Piece Rsrc Size */            \
  861.         evenPaddedString            /* Source Piece Rsrc Name */                
  862. #define    SrcPartsList                                                            \
  863.         integer = $$CountOf (Pieces);/* Number of source pieces */    \
  864.         wide array Pieces{                                                        \
  865.             RsrcSpec;                    /* Description of this piece*/    \
  866.         }
  867. #define Strike                                                                        \
  868.     integer;                        /* Font Size */                                \
  869.     Style;                        /* Font Style */                                \
  870.     RsrcType;                    /* Target Font Resource Type */            \
  871.     integer;                        /* Target Attributes */                        \
  872.     SrcPartsList;                /* Optional source pieces */
  873.     
  874. type 'inff' {
  875.     switch {
  876.         case format2:
  877.             key integer = 2;            /*format version 2 */
  878.             fontFamilyAtomFlags;        /* Font Atom Flags */
  879.             fileSpecID;                    /* Target File Spec */
  880.             fileSpecID;                    /* FOND Source File Spec */
  881.             integer;                        /* Target FOND Attributes */
  882.             unsigned longInt;            /* Family Size */
  883.             rsrcID;                        /* Target Family Number */
  884.             switch {
  885.             case entireFamily:
  886.                  key integer = 1;
  887.             case explicitFamilyMembers:
  888.                 key integer = 2;
  889.                 unsigned integer = $$CountOf(StrikeEntries);
  890.                 wide array StrikeEntries {
  891.                     Strike;                /* Source for each of the strikes */
  892.                 };
  893.             };
  894.             rsrcID;                        /* Atom Extender ID */
  895.             evenPaddedString;            /* Atom Description */
  896.             evenPaddedString;            /* Family Name */
  897.     };
  898. };
  899. Flag Descriptions
  900. deleteWhenRemoving/dontDeleteWhenRemoving    
  901. Determines if specific font strikes or the entire family is deleted during a removal.
  902.     Using with explicitFamilyMembers copy option — When using the deleteWhenRemoving flag, if the target font strike exists and the user clicks Remove the strike is deleted.  If a strike does not exist on the target disk, this flag is ignored.  If all font strikes for a given family are removed, the family’s ‘FOND’ resource is also deleted.  
  903.     Using with entireFamily copy option — When using the deleteWhenRemoving flag, the family’s ‘FOND’ resource and all  font strikes for the family are deleted.
  904.     Note that the font atom must be part of a package that uses the removable flag. 
  905. deleteWhenInstalling/dontDeleteWhenInstalling
  906. Determines if specific font strikes or the entire family is deleted during an installation when using the dontCopy flag.
  907.     Using with explicitFamilyMembers copy option — When using the deleteWhenRemoving flag, if the target font strike exists and the user clicks Remove the strike is deleted.  If a strike does not exist on the target disk, this flag is ignored.  If all font strikes for a given family are removed, the family’s ‘FOND’ resource is also deleted.  
  908.     Using with entireFamily copy option — When using the deleteWhenRemoving flag, the family’s ‘FOND’ resource and all  font strikes for the family are deleted.
  909.     The deleteWhenInstalling flag is primarily used for deleting previously installed font resources that are no longer needed.
  910. copy/dontCopy    Determines if the font resources are copied or not during an installation.  Note that some flags (leaveAloneIfNewer, keepExisting, copyIfUpdate) can prevent copying from happening under the circumstances specified.  
  911. noEncodedFONDRsrc/encodedFONDRsrc
  912. Allows ‘FOND’ resources to be encoded into the resource type ‘iFND’ when compessing the font resources.  This is recommended to help prevent the system software from becoming confused when finding a ‘FOND’ resource in your source file that may reference not existent font resources.
  913. tgtRequired/noTgtRequired
  914. The target file must already exist.  If the target file does not exist, the user is warned that a target file is needed.  When using the noTgtRequired flag and the target file does not exist, the Installer will create one.
  915. keepExisting/updateExisting
  916. Allows the scriptwriter to preserve existing font resources when using the copy and/or deleteOnInstall flag.  Use the keepExisting flag to prevent the Installer from disturbing an existing target font strike or family.  
  917.     Using with explicitFamilyMembers copy option — When using the keepExisting flag and a specific strike in the ‘FOND’ resource already exists in the target file, it will not be replaced. 
  918.     Using with entireFamily copy option — When using the keepExisting flag and the ‘FOND’ resource already exists, no strikes will be copied or replaced.  
  919.     No copying will occur if the updateExisting flag is used with the copyIfUpdate flag.
  920. copyIfUpdate/copyIfNewOrUpdate
  921. Allows the scriptwriter to update a font resource only if it already exists.  Use the copyIfUpdate flag to prevent a new resource from being created.  
  922.     Using with explicitFamilyMembers copy option — When using the copyIfUpdate flag, a specific strike is copied to the target file only if the strike already exists in the target file. 
  923.     Using with entireFamily copy option — The entire source font family will be copied if any strikes exist in the target file. 
  924.     If the copyIfUpdate flag is used with the keepExisting flag, then no copying will occur.
  925. ignoreProtection/dontIgnoreProtection
  926. Determines if the user should be alerted if any font resource with its protected bit set will be replaced or deleted.  
  927.     Using with explicitFamilyMembers copy option — When using the dontIgnoreProtection flag, if the ‘FOND’ resource or any font resource to be replaced has the protection flag set, the user will be alerted, and the installation will be canceled.  Use the dontIgnoreProtection flag if preserving protected font resources is important.  When using the ignoreProtection flag the font resources are deleted from or updated in the target file even if it any are protected in the target file.
  928.     Using with entireFamily copy option — When using the dontIgnoreProtection flag the user is alerted only if the ‘FOND’ resource is protected, but if any other font resources are protected, they will be replaced without alerting the user.  When using the ignoreProtection flag the font resources are deleted from or updated in the target file even if it any are protected in the target file.
  929. srcNeedExist/srcNeedNotExist
  930. Determines whether the source font resources must exist on the source disk.  Use the srcNeedNotExist flag if the source resources can optionally reside on the source disk.  If the source file or source resources are not found, the atom it is ignored and the installation continues normally.
  931. byID/byName    Determines how the font strike resources should be found in the source files. If using the byID flag the font strike’s resources are found in the source file using only the ID.  If you want to require the resource name to match as well then use the nameMustMatch flag.  Note that the byID flag can only be used when installing using the explicitFamilyMembers copy option and split source resources are specified.  If using the byName flag the font strike resources are found in the source file using only the name specified in the Source Piece Rsrc Name field.
  932. nameMustMatch/nameNeedNotMatch
  933. Specifies if the font strike resources found in the source file using their IDs must have the name in the Source Piece Rsrc Name field.  Note that the nameMustMatch flag can only be used when installing using the explicitFamilyMembers copy option and split source resources are specified.  This flag is ignored if the byName flag is used.
  934. Field Descriptions
  935. Target File Spec ID    The resource ID of a Target File Spec script resource (‘intf’, or ‘infs’ for pre-4,0 scripts) describing the file on the target disk where the resource will be deleted, created, or updated.  (2-bytes) 
  936. Source File Spec ID    The resource ID of a Source File Spec script resource describing the file on the source disk that contains the 'FOND' resource to be copied into the target file. 
  937.     Using with explicitFamilyMembers copy option — If no optional split source information is provided, the strikes specified must also be contained in the same file as the source ‘FOND’ resource.  Optional split source information always overrides that default source for those strikes that use it.
  938.     Using with entireFamily copy option — The source strike resources referenced in the source 'FOND' resource must be contained in the same source file as the source 'FOND' resource.  
  939.     If you’re just deleting strikes and therefore don’t need a source file, set this field to 0.  (2-bytes)
  940. Target FOND Attributes    The resource attributes that will be given to the target 'FOND' resource during installation.  See Inside Macintosh Vol. I, page 111 for more information about resource attributes.  (2-bytes)
  941. Font Family Size    The size in bytes of all font resources including the 'FOND' resource to be installed or deleted.  This field is used by the Installer in figuring the sizes for an installation.  (4-bytes)
  942. Target FOND ID    The resource ID that will be given to the target 'FOND' resource.  Normally, this ID should also be the same ID as the resource ID of the source 'FOND' resource.  The Installer always sets the family number field contained in the ‘FOND’ resource to the resource ID of the ‘FOND’ when it is copied or updated.  (2-bytes)
  943. How-To-Copy Value Key    Specifies how the font resources will be copied, or deleted. Currently, the two copy options are available:  entireFamily Value (1), and explicitFamilyMembers Value (2).  (2-bytes)
  944.     Using the entireFamily copy option — Tells the Installer that all strikes specified in the source 'FOND' resource will be copied.  The 'FONT', 'NFNT', or 'sfnt' resources must exist in the same source file as the 'FOND' resource.  The Copy Entire Family Value is provided to copy small, simple font families with minimal scripting effort.  Since the target resource attributes cannot be specified, the target resource inherits the source's.  If the Font Family Atom Flags are set for deleteWhenRemoving or deleteWhenInstalling & dontCopy the target 'FOND' resource and ALL of its referenced strikes will be deleted from the target file upon removal or installation.  (2-bytes)
  945.     Using the explicitFamilyMembers copy option — Tells the Installer that one or more strikes are specified in the following member list.  (2-bytes)
  946. Point Size     The family member's point size.  (2-bytes)
  947. Style     Contains flags describing the style of the font.  The style bits are defined below.  (2-bytes)
  948. Bit 0:    Set for Bold
  949. Bit 1:    Set for Italic
  950. Bit 2:    Set for Underline
  951. Bit 3:    Set for Outline
  952. Bit 4:    Set for Shadow
  953. Bit 5:    Set for Condensed
  954. Bit 6:    Set for Extend
  955. All other bits are reserved.
  956. Resource Type    The resource type of the target or source font resource.  This will be the type of the font resource created by combining the split resources.  If no split resource information is given, this field should be the type of the source font resource (e.g. 'FONT', 'NFNT', or 'sfnt').  (4-bytes)
  957. Resource Attributes    The resource attributes that will be given to the target font resource.  The Split Resource list specifies one or more resources that make up the font resource when combined in the order listed.  (2-bytes)
  958. Split Resource File Spec ID
  959. The Split Resource File Spec ID field is a 2-byte field that specifies the file on the source disk that contains the split resource to be combined.  (2-bytes)
  960. Split Resource Type    The resource type of the source split resource.  Usually, this should be type 'part'.  (4-bytes)
  961. Split Resource ID    The resource ID of the source split resource.  (2-bytes)
  962. Split Resource Size    The exact size in bytes of the source split resource.  (4-bytes)
  963. Split Resource Name    The name of the source split resource.  If the resource is being found using the byName flag, this field must be filled.  To help ensure that the correct resource is being installed, the name of the resource in the source file must match this field if the resource is being found by name.  (even-padded Pascal string)
  964. Atom Extender ID    The resource ID of an Atom Extender ‘inex’ script resource.  This Atom Extender will be called during copying of each font resource part.  (2-bytes)
  965. Font Family Atom Description
  966. A Pascal string describing the atom.  This field is used as part of the status dialog.  If this field is not empty, the status dialog displays “Reading <Description String>”, or “Writing <Description String>”.  If this field is empty, the status dialog displays “Reading font: <Font Family Name>”, or “Writing font: <Font Family Name>”.  (even-padded Pascal string)
  967. Font Family Name    The family name.  The family name will be used to find the source and target 'FOND' resource.  (even-padded Pascal string)
  968. About the ResMerge Atom (‘inrm’)
  969. The ResMerge Atom can be used to copy all resources from a source file to a target file.  Each resource is copied separately, replacing an existing resource of the same type and ID.  Because the ResMerge Atom offers no options, you may find that you will need to use individual Resource Atoms to handle special situations.
  970. The ResMerge Atom is unique from using Resource Atoms because anyone can add to or delete resources from the source file without changing the atom.  This is acceptable as long as the Installer can successfully preflight the required disk space.  A field in the atom holds the total size the resources expect to occupy in the target file.  This flexibility comes at a cost to ease of use because the Installer cannot determine during preflighting how many resources will be replaced, thus not requiring additional disk space.  We will therefore usually overestimate the required disk space, forcing the user to make more space available than will probably be necessary.
  971. Using the ResMerge Atom
  972. The ResMerge Atom offers limited options, so determining when to use the ResMerge Atom versus separate Resource Atoms or a File Atom is important.  The main purpose of the ResMerge Atom is to provide a simple high-level resource copy mechanism without forcing the scriptwriter to create numerous Resource Atoms.
  973. The Installer executes a ResMerge Atom by automatically converting the atom into individual Resource Atoms when the Installer is ready to begin reading from the source disk.  The Resource Atom is created with the following flags:
  974. n    dontDeleteWhenRemoving — The ResMerge Atom does nothing during a removal.
  975. n    dontDeleteWhenInstalling.
  976. n    copy.
  977. n    noTgtRequired — The target file will be created if it does not already exist.
  978. n    updateExisting — Existing resources with the same type and ID will be replaced.
  979. n    copyIfNewOrUpdate.
  980. n    srcNeedNotExist — Doesn’t really matter because if it didn’t exist we would not be creating this Resource Atom to copy it.
  981. n    byID.
  982. n    nameNeedNotMatch — The name is ignored, but the new name will replace the old name if different.
  983. NOTE
  984. System Software scriptwriters must use care when using the ResMerge Atom because on pre-7.0 systems we determine if the Folder Manager will be available based on the presence of a Resource Atom copying a ‘fld#’ resource.  This means a separate Resource Atom must always be created to install the ‘fld#’ resource. u
  985. ResMerge Atom Reference
  986. The format of the ResMerge Atom is simple.  Its template is shown below.
  987. #define    resMergeAtomFlags                                                    \
  988.         fill bit[16];
  989. type 'inrm' {
  990.         switch {
  991.             case format0:
  992.                 key integer = 0;            /* ResMerge Atom Format version */
  993.                 mergeAtomFlags;            /* ResMerge Atom Flags */
  994.                 unsigned longInt;            /* Total Resources Size */
  995.                 fileSpecID;                    /* Target File Spec. Rsrc ID */
  996.                 fileSpecID;                    /* Source File Spec. Rsrc ID */
  997.                 evenPaddedString;            /* Status Description */    
  998.         };
  999. };
  1000. Field descriptions 
  1001. ResMerge Atom Flags     Currently reserved for use by Apple Computer, Inc.  (2-bytes)
  1002. Total Resources Size     The size that all resources will occupy in the target file.  For most purposes, the size of the source file’s resource fork is an adequate estimate.  This field is used by the Installer to figure the amount of disk space required.  (4-bytes)
  1003. Target File Spec. Rsrc ID 
  1004. The resource ID of a Target File Spec (‘intf’) script resource describing the desired location of the target file.  (2-bytes)
  1005. Source File Spec. Rsrc ID 
  1006. The resource ID of a Source File Spec (‘infs’) script resource describing the location of the source file.  (2-bytes)
  1007. Status Description    An optional string that is displayed in the Status dialog during execution of the ResMerge Atom. (even-padded Pascal string) 
  1008. About the Folder Atom (‘infm’)
  1009. The Folder Atom can be used to copy all files from the root-level of a source folder to the root-level of a target folder.  Each file is copied separately, replacing an existing file of the same name.  Folders within the source folder are ignored, and must be copied using separate Folder Atoms.  Because the Folder Atom offers no options, you may find that you will need to use individual Resource Atoms to copy some or all the resources.
  1010. The Folder Atom is unique from using File Atoms because anyone can add to or delete files from the source folder without changing the atom.  This is OK as long as the Installer can successfully preflight the required disk space.  A field in the atom holds the total size the source files.  This flexibility comes at a cost to ease of use because the Installer cannot determine during preflighting how many files will be replaced, thus not requiring additional disk space.  We will therefore usually overestimate the required disk space, forcing the user to make more space available than will probably be necessary.
  1011. NOTE
  1012. The Folder Atom only copies the files at the root level of the source folder.  Nested folders must be copied separately with additional Folder Atoms.  u
  1013. Using the Folder Atom
  1014. The Folder Atom offers no options, so determining when to use the Folder Atom versus separate File Atoms is important.  The main purpose of the Folder Atom is to provide a simple high-level file copy mechanism without forcing the scriptwriter to create numerous File Atoms.  The Folder Atom does not support decompression or version comparison.
  1015. The Installer executes a Folder Atom by automatically converting the atom into individual File Atoms when the Installer is ready to begin reading from the source folder.  The File Atom is created with the following flags:
  1016. n    dontDeleteWhenRemoving — The Folder Atom does nothing during a removal.
  1017. n    dontDeleteWhenInstalling.
  1018. n    copy.
  1019. n    dontIgnoreLockedFile — The user is notified about locked target files, and the installation is stopped.
  1020. n    dontSetFileLocked or setFileLocked — If the source file is locked it will be locked after it is copied.
  1021. n    useSrcCrDateToCompare — Since no version compare procedure can be specified.
  1022. n    srcNeedNotExist — Doesn’t really matter because if it didn’t exist we would not be creating this File Atom to copy it.
  1023. n    rsrcForkInRsrcFork — Since no decompression is allowed.
  1024. n    updateExisting — Existing files with the same name will be replaced.
  1025. n    copyIfNewOrUpdate.
  1026. n    rsrcFork — Copy resource fork if it exists.
  1027. n    dataFork — Copy data fork if it exists.
  1028. Specifying the Source and Target Folder
  1029. The standard ‘infs’ and ‘intf’ file spec resources are used to specify the source and target folder with several differences: 
  1030. n    The path name is similar to normal file specs, but the path should end with the name of the source or target folder.  A colon at the end of the path is optional.
  1031. n    All File Spec flags are ignored when used with Folder Atoms.
  1032. n    The File Type, File Creator and Creation Date fields are ignored when used with Folder Atoms. 
  1033. NOTE
  1034. The reserved folder path name “special-xxxx” cannot be used with Folder Atoms.  If you do, the user will be told the script document is damaged.  u
  1035. Installing Folders with Custom Icons
  1036. The Folder Atom will automatically set the target folder to use the source folder’s custom icon if one exits.  Although the scriptwriter need not be aware of how the custom icon is stored, the Installer uses the File Atom’s feature of setting the target folder’s icon whenever the special invisible “Icon\n” file is written to disk.
  1037. Creating Empty Folders with a Folder Atom
  1038. The Installer will not create a target folder if there are no files are present in the source file.  If you wish to create an empty folder, the easiest work around is to create a custom icon for the source folder, thereby causing the invisible “Icon\n” file to be copied, and the target folder to be created.
  1039. Folder Atom Reference
  1040. The format of the Folder Atom is simple.  Its template is shown below.
  1041. #define    folderAtomFlags                                                        \
  1042.         fill bit[16];
  1043. type 'infm' {
  1044.         switch {
  1045.             case format0:
  1046.                 key integer = 0;            /* Folder Atom Format version */
  1047.                 folderAtomFlags;            /* Folder Atom Flags */
  1048.                 unsigned longInt;            /* Total Folder Size */
  1049.                 rsrcID;                        /* Target File Spec. Rsrc ID */
  1050.                 rsrcID;                        /* Source File Spec. Rsrc ID */
  1051.                 evenPaddedString;            /* Status Description */
  1052.         };
  1053. };
  1054. Field Descriptions 
  1055. Folder Atom Flags     Currently reserved for use by Apple Computer, Inc.  (2-bytes)
  1056. Total Folder Size     The size of all files in the source folder.  This field is used by the Installer to figure the amount of disk space required.  (4-bytes)
  1057. Target File Spec. Rsrc ID 
  1058. The resource ID of a Target File Spec (‘intf’) script resource describing the desired location of the target folder.  (2-bytes)
  1059. Source File Spec. Rsrc ID 
  1060. The resource ID of a Source File Spec (‘infs’) script resource describing the location of the source folder.  (2-bytes)
  1061. Status Description    An optional string that is displayed in the Status dialog during execution of the Folder Atom. (even-padded Pascal string) 
  1062. Using Action Atoms (‘inaa’)
  1063. Action Atoms are used to run a code resource at the beginning and/or end of an installation or removal.
  1064. To use an Action Atom, an 'inaa' resource must first be added to the script.  This atom specifies the resource which contains an executable piece of code.  The user-defined Action Atom code can be executed at two different times for installations.  One is after the user clicks on the Install button but before installation begins.  The other is after the installation is finished, but before the user is asked to quit or continue.  The code can also be executed at two different times for removals.  One is after the user clicks on the Remove button but before removal begins.  The other is after the removal is finished, but before the user is asked to quit or continue.  A new option allows the Busy Cursor animation to be continued/suspended during execution of the action atom code resource.  This option is useful when the code resource displays a dialog and the Busy Cursor is not appropriate.  For installation and removal the order of execution is defined by the ID of the 'inaa' resources.
  1065. Action Atom Reference
  1066. This section describes the Action Atom resource format, data structures and function interface.
  1067. Resource Description
  1068. The format of the Action Atom is shown below.
  1069. #define    actionAtomFlagsFormat2                                                \        fill bit[12];                                                                 \
  1070.         boolean        continueBusyCursors,    suspendBusyCursors            \
  1071.         boolean        actAfter, actBefore;                                        \
  1072.         boolean        dontActOnRemove, actOnRemove;                            \
  1073.         boolean        dontActOnInstall, actOnInstall;
  1074. type 'inaa' {
  1075.         switch {
  1076.             case format2:
  1077.                 key integer = 2;            /* Action Atom Format version. */
  1078.                 actionAtomFlagsFormat2;    /* Action Atom Flags */
  1079.                 literal longint;            /* Code Resource Type */
  1080.                 integer;                        /* Code Resource ID */
  1081.                 longint;                        /* RefCon */
  1082.                 longint;                        /* Requested Memory (in bytes) */
  1083.                 evenPaddedString;            /* Status Description */
  1084.         };
  1085. };
  1086. Flag Descriptions 
  1087. continueBusyCursors/suspendBusyCursors
  1088. Controls whether the counting fingers busy cursor should be stopped and an arrow cursor shown prior to calling the Action Atom code resource.  Use the suspendBusyCursors flag when you want to display a dialog from within your Action Atom code resource.
  1089. actAfter/ActBefore     Determines whether this Action Atom code resource is called before or after the installation/removal.
  1090. dontActOnRemove/actOnRemove 
  1091. Determines if this Action Atom code resource should be called on a removal.
  1092. dontActOnInstall/actOnInstall 
  1093. Determines if this Action Atom code resource should be called on an installation.
  1094. Field descriptions 
  1095. Code Resource Type     The resource type of the code resource, usually ‘infn’.  (4-bytes)
  1096. Code Resource ID     The resource ID of the code resource.  (2-bytes)
  1097. RefCon     A value to be passed directly to the code resource.  For example, the System 7.X Installer script has all of its Action Atoms linked together into one code resource and uses this refCon value as a selector that tells which action atom to run.  By linking all action atoms together into one code resource and eliminating duplicate code, we cut the size of our action atoms in half.  (4-bytes)
  1098. Requested Memory    The requested number of bytes that should be available in the Action Atom’s sub-heap when called.  Enter 0 (zero) to not create a sub-heap and run inside the Installer’s heap.  Please  see warnings about using sub-heaps in the Atom Extender section if you specify a value other than 0.  (4-bytes) 
  1099. Status Description    An optional string that is displayed in the Status dialog during execution of the Action Atom. (even-padded Pascal string) 
  1100. Data Structures
  1101. Function Interface
  1102. The entry point of the Action Atom code resource must have the interface:
  1103. ActionAtomResult    ActionAtomFormat2( ActionAtom2PBPtr );
  1104. The Action Atom should return a result telling the Installer what to do after executing the code resource.  You can use these constants to specify the result code:
  1105. enum {      kActionAtomResultFatalError = -1,
  1106.             kActionAtomResultContinue = 0,
  1107.             kActionAtomResultCancel = 1 };
  1108. typedef long ActionAtomResult;
  1109. Return results produce the following effect:
  1110. n    Return kActionAtomResultContinue if you wish the installation to continue.
  1111. n    Return kActionAtomResultCancel to cancel the installation, just as if the user had pressed the Cancel button.  When an action atom returns the cancel message, all action atom waiting in the queue are not run.  Cancel messages are then sent to all ‘after’ action atoms to allow them to clean up their environment.
  1112. n    Return kActionAtomResultFatalError to signal that there is something seriously wrong, and the installation should not continue.  When an action atom returns the error message, all action atoms waiting in the queue are not run.  Cancel messages are then sent to all ‘after’ action atoms to allow them to clean up their environment.
  1113. s    W A R N I N G
  1114. If you choose to create a sub-heap for each invocation of format 2 of the Action Atom please read the section “Running with a Sub-Heap” within the Atom Extender portion of this document.  You can enter 0 (zero) in the requested memory field to not create a sub-heap and run inside the Installer’s heap.   s
  1115. Parameter Block
  1116. The Action Atom parameter block contains information about the Installer’s environment.  The parameter block has the structure:
  1117. typedef struct {
  1118.     InstallationStage    fMessageID;
  1119.     Handle                fStaticDataHdl;
  1120.     ProcPtr                fCallBackProcPtr;
  1121.     short                    fTargetVRefNum;
  1122.     long                    fTargetFolderDirID;
  1123.     short                    fSystemVRefNum;
  1124.     long                    fSystemBlessedDirID;
  1125.     long                    fRefCon;
  1126.     Boolean                fDoingInstall;
  1127.     Boolean                fDidLiveUpdate;
  1128.     long                    fInstallerTempDirID;
  1129. }ActionAtom2PBRec, *ActionAtom2PBPtr;
  1130. Field Descriptions 
  1131. fMessageID    One of three messages the Atom Extender will receive when being called. Use these constants to understand the message ID:
  1132.     enum {before, 
  1133.     after, 
  1134.     cleanUpCancel };
  1135.     typedef unsigned char InstallationStage;
  1136.     If your Action Atom is running before the installation takes place, the fMessageID field is before.  
  1137.     If your Action Atom is running after the installation completes successfully, the fMessageID field will be after.
  1138.     If the user clicks the Cancel/Stop button, or the Installer cancels the installation because of an error, cleanUpCancel messages are sent to all ‘after’ action atoms to allow them to clean up their environment.  Each ‘after’ action atom is guaranteed to receive only one cancel message if the installation is canceled or stopped.  This may happen before the ‘before’ actions atoms have run, so it’s important to be smart within your cleanup routines.
  1139. fStaticDataHdl    A handle created by the Action Atom using INewHandle to save information between before and after calls to this Action Atom.  The field is always NULL when receiving a before message.  You can assign a value to this field during the first call to the Action Atom, and receive the same value in this field during the next call.
  1140. fCallBackProcPtr    A pointer to the Installer’s dispatch routine.  You’ll need to pass this field as a parameter to glue routines that provide access to Installer functions.
  1141. fTargetVRefNum    The target disk’s vRefNum.  When allowing the user to select a target application folder, this is the volume on which the folder resides.
  1142. fTargetFolderDirID    The target application folder’s directory ID.  Target File Specs that use the reserved folder path folder-user will be placed in this folder.  This value is -1 if the Installer is using disk mode, the folder does not exist, or a File Spec referencing the reserved folder path folder-user has not been referenced by any atom included in the installation.  
  1143. fSystemVRefNum    The system disk’s vRefNum.  Target File Specs that use the reserved folder path special-xxx will be placed in the System Folder on this volume.
  1144. fSystemFolderDirID    The directory ID of the System Folder on the disk with the refNum fSystemVRefNum.  This directory is not necessarily the currently active System Folder.
  1145. fRefCon    A 4-byte value defined by the scriptwriter in the ‘inex’ script resource.
  1146. fDoingInstall    TRUE if the user is performing an installation; otherwise, FALSE if the user is removing.
  1147. fDidLiveUpdate    TRUE if the Installer is modifying files inside the active System Folder.
  1148. fInstallerTempDirID    The directory ID of the temporary folder on the volume specified in the fSystemVRefNum field.  The temporary folder holds the files that we are modifying to allow rollback in case the installation is canceled.  You’ll rarely ever need to look inside this folder.
  1149. Using Audit Atoms (‘inat’)
  1150. During the development of System Software scripts, there were many times we wished that there was a history of what had previously been installed.  For example, the user did a minimal SE System Software installation, and later wanted to add minimal Macintosh II System Software.  During the second installation, the Installer should be smart enough to update the disk with both SE and II software.  Installer Audit Atoms were added to facilitate this type of updating.  Their format is shown below.
  1151. When the Installer finds an Audit Atom in a script, after an installation is complete, it adds a new resource (type 'audt') to the target file specified in the Audit Atom.  This resource contains an array of audit selector/value pairs.  If an 'audt' resource already exists in the target file and there is no entry for the given selector, an entry is added.  If an entry for the selector already exists, the higher of the two values is used.  Using the Installer Rules checkAuditRecord and checkAnyAuditRecord, later installations can make decisions based on this history.
  1152. Audit Atom Reference
  1153. Resource Description
  1154. Format 0 of the ‘inat’ resource:
  1155. type 'inat' {
  1156.     switch {
  1157.         case format0:
  1158.             key integer = 0;
  1159.                 FileSpecID;            /* Target File Spec Rsrc ID*/
  1160.                 OSType;                /* Audit Selector */
  1161.                 literal longint;    /* Audit Value */
  1162.             };
  1163. };
  1164. Field descriptions
  1165. Target File Spec. Rsrc ID     
  1166. The resource ID of a Target File Spec. of which you want to add or update the audit resource.  Apple uses the System File to keep a history of System Software that has been installed.  A File Spec ('intf' resource) must exist in the script with this ID.  (2-bytes)
  1167. Audit Selector     A meaningful type.  (4-bytes)
  1168. Audit Value     A meaningful value.  (4-bytes)
  1169. Using Boot Block Atoms (‘inbb’)
  1170. Boot Block Atoms are used to write or change the parameters in a target volume’s boot blocks.  Boot Block Atoms are different from file and resource atoms – they can indicate something to be copied, or indicate an individual parameter that needs to be changed.
  1171. To cause boot blocks to be written to a target volume, include a Boot Block Atom with a key of type 'bbUpdate'.  The argument to this type of Boot Block Atom is an integer which indicates the ID of a File Spec in the script.  The file indicated by this File Spec should contain a 'boot' resource.  A copy of the resource is written to the first two blocks of the target volume.
  1172. Boot Block Atom Reference
  1173. Resource Description
  1174. Format 0 of the ‘inbb’ resource:
  1175. #define    BootBlockAtomFlags                                        \
  1176.     fill bit[14];                                                        \
  1177.         boolean    dontChangeOnInstall, changeOnInstall;        \
  1178.         boolean    dontChangeOnRemove, changeOnRemove;
  1179. #define    BootBlockUpdateFlags                                        \
  1180.         fill bit[7];                                                    \
  1181.         boolean    replaceBBSysName, saveBBSysName;             \
  1182.         boolean    replaceBBShellName, saveBBShellName            \
  1183.         boolean    replaceBBDbg1Name, saveBBDbg1Name;            \
  1184.         boolean    replaceBBDbg2Name, saveBBDbg2Name;             \
  1185.         boolean    replaceBBScreenName, saveBBScreenName;        \
  1186.         boolean    replaceBBHelloName, saveBBHelloName;         \
  1187.         boolean    replaceBBScrapName, saveBBScrapName;        \
  1188.         boolean    replaceBBCntFCBs, maxBBCntFCBs;                 \
  1189.         boolean    replacebbCntEvts, maxBBCntEvts                \
  1190. type 'inbb' {
  1191.     switch {
  1192.         case format0:
  1193.             key integer = 0;
  1194.             BootBlockAtomFlags;
  1195.                 switch {
  1196.                     case bbUpdate:
  1197.                         key integer = -1;    
  1198.                         RsrcID;    
  1199.                         BootBlockUpdateFlags;
  1200.                         
  1201.                     case bbID:
  1202.                         key integer = 1;
  1203.                         decimal integer;
  1204.                     
  1205.                     case bbEntry:
  1206.                         key integer = 2;
  1207.                         decimal longint;
  1208.                         
  1209.                     case bbVersion:
  1210.                         key integer = 3;
  1211.                         decimal integer;
  1212.                         
  1213.                     case bbPageFlags:
  1214.                         key integer = 4;
  1215.                         decimal integer;
  1216.                         
  1217.                     case bbSysName:
  1218.                         key integer = 5;
  1219.                         EvenPaddedString;
  1220.                         
  1221.                     case bbShellName:
  1222.                         key integer = 6;
  1223.                         EvenPaddedString;
  1224.                         
  1225.                     case bbDbg1Name:
  1226.                         key integer = 7;
  1227.                         EvenPaddedString;
  1228.                         
  1229.                     case bbDbg2Name:
  1230.                         key integer = 8;
  1231.                         EvenPaddedString;
  1232.                         
  1233.                     case bbScreenName:
  1234.                         key integer = 9;
  1235.                         EvenPaddedString;
  1236.                         
  1237.                     case bbHelloName:
  1238.                         key integer = 10;
  1239.                         EvenPaddedString;
  1240.                         
  1241.                     case bbScrapName:
  1242.                         key integer = 11;
  1243.                         EvenPaddedString;
  1244.                         
  1245.                     case bbCntFCBs:
  1246.                         key integer = 12;
  1247.                         decimal integer;
  1248.                         
  1249.                     case bbCntEvts:
  1250.                         key integer = 13;
  1251.                         decimal integer;
  1252.                         
  1253.                     case bb128KSHeap:
  1254.                         key integer = 14;
  1255.                         decimal longint;
  1256.                         
  1257.                     case bb256KSHeap:
  1258.                         key integer = 15;
  1259.                         decimal longint;
  1260.                         
  1261.                     case bb512KSHeap:
  1262.                         key integer = 16;
  1263.                         decimal longint;
  1264.                         
  1265.                     case bbSysHeapSize:
  1266.                         key integer = 16;
  1267.                         decimal longint;
  1268.                         
  1269.                     case bbSysHeapExtra:
  1270.                         key integer = 18;
  1271.                         decimal longint;
  1272.                         
  1273.                     case bbSysHeapFract:
  1274.                         key integer = 19;
  1275.                         decimal longint;
  1276.                 };
  1277.                 EvenPaddedString;            /* Boot Block Atom Description */
  1278.         };
  1279. };
  1280. Flags descriptions
  1281. dontChangeOnInstall/changeOnInstall     
  1282. Determine if the boot blocks should be updated during an installation.  (2-bytes)
  1283. dontChangeOnRemove/changeOnRemove     
  1284. Not currently supported.  (2-bytes)
  1285. Field descriptions
  1286. Boot Block Value Key     Specifies which boot block parameter is being given a value in the Boot Block Value field.  The key can correspond to any of the parameters which are changeable in the boot blocks.  (2-bytes)
  1287.     The possible keys for this field are as follows:
  1288. bbUpdate    Copy over boot blocks from a 'boot' resource found in the file whose File Spec ID is given in the 2-byte value field.  A second 2-byte value field is used for this type of Boot Block Value.  This second value field is used to specify which boot block fields are to be updated from the 'boot' resource, and which ones are to be preserved on the target disk.  If bits 0 through 6 are set, the appropriate value on the target is kept if it appears to be a legal value or string.  If bits 7 or 8 are set, the maximum parameter from the resource or what already exists on the target is preserved.  The format of this field is as follows:
  1289. bbID    The Boot Block Value field updates the boot blocks ID (2-bytes).
  1290. bbEntry    The value updates the boot block entry point (4-bytes).
  1291. bbVersion    The value updates the boot block version (2-bytes).
  1292. bbPageFlags    The value updates the page 2 usage flags (2-bytes).
  1293. bbSysName    The value updates the name of the system resource file (string).
  1294. bbShellName    The value updates the name of the system shell (string).
  1295. bbDbg1Name    The value updates the first loaded debugger’s name (string).
  1296. bbDbg2Name    The value updates the second loaded debugger’s name (string).
  1297. bbScreenName    The value updates the file name of the startup screen (string).
  1298. bbHelloName    The value updates the file name of the startup program (string).
  1299. bbScrapName    The value updates the file name of the system scrap file (string).
  1300. bbCntFCBs    The value updates the number of FCBs to open (2-bytes).
  1301. bbCntEvts    The value updates the size of the event queue (2-bytes).
  1302. bb128KSHeap    This boot block field is no longer used.
  1303. bb256KSHeap    This boot block field is no longer used.
  1304. bb512KSHeap    The value updates the size of the system heap on a 512K Mac (4-bytes).
  1305. bbSysHeapSize    The value updates the absolute size of the system heap (4-bytes).
  1306. bbSysHeapExtra    This boot block field is no longer used.
  1307. bbSysHeapFract    The value updates the minimal additional system heap space required (4-bytes).
  1308.     Note: Under System 7.0 and greater, the system heap space and the number of FCBs to open are dynamically determined and not controlled by the boot block value.
  1309. Boot Block Value     The value for the boot block parameter that was specified in the boot block value key.  It has a size as given above (in parentheses).  (size depends on the type of update)
  1310. About Atom Extenders (‘inex’)
  1311. Scriptwriters can use Atom Extenders to enhance or replace the default copy mechanism of the Installer.  The most obvious purpose of the Atom Extender is to provide transparent decompression of files during installation.  Scriptwriters presently using Action Atoms to perform decompression, either written by themselves or a third-party developer, will want to use Atom Extenders for this purpose in the future.
  1312. If you want to write an Atom Extender then read the section “Writing Atom Extenders” to learn how.  If you only want to take advantage of an Atom Extender someone else has written then consult the sections describing the File Atom, Resource Atom and Font Atom.
  1313. Writing Atom Extenders
  1314. An Atom Extender is a newly-defined script resource of type ‘inex’ that can be referenced from new versions of the File Atom, Resource Atom, and Font Atoms.  At the heart of the Atom Extender is a code resource (provided by the scriptwriter) that contains the necessary 68K code to be executed at the desired point in the installation. 
  1315. This section describes the necessary steps to create an Atom Extender.
  1316. Creating an ‘inex’ Script Resource
  1317. The new ‘inex’ script resource contains the necessary information to properly call the specified code resource.  
  1318. Code Listing 3-1    Sample ‘inex’ script resource
  1319. resource 'inex' (129) {
  1320.     format0 {
  1321.         dontSendInitMessage,        /* Don’t send kInitialize message */
  1322.         sendBeforeMessage,        /* Send kBeforePart message */
  1323.         dontSendAfterMessage,    /* Don’t send kAfterPart message */
  1324.         dontSendSuccessMessage,    /* Don’t send kSuccess message */
  1325.         dontSendCancelMessage,    /* Don’t send kCancel message */
  1326.         continueBusyCursors,        /* Show busy cursor during call */
  1327.         'infn',                        /* Resource type of code resource */
  1328.         128,                            /* Resource ID of code resource */
  1329.         100,                            /* RefCon (long integer) */
  1330.         30720,                        /* 30K of requested free memory in heap */
  1331.         "This is a test."            /* Status description during call */
  1332.     }
  1333. };
  1334. The sample ‘inex’ resource in Code Listing 3-1 asks the Installer to call the code resource with the type ‘infn’ and ID = 128 before the Installer begins copying the atom’s data from which the Atom Extender is referenced.  When the code resource is called it will have a maximum of 30720 bytes of free memory in its own heap, from which it can allocate memory using Memory Manager routines, such as NewPtr and NewHandle.  You must check the actual size of the heap at the beginning of your code resource to make sure you were allocated the full amount, since the Installer calls you whether or not your requested was fully granted.  This error will usually be an idication that the Installer’s memory partition is set too low.  The actual heap size is usually 5K larger than the requested size, but you should never depend on this being true.
  1335. NOTE
  1336. Atom Extenders are only called during installations, never during removals. u
  1337. Writing a Simple Atom Extender
  1338. A very simple task for an Atom Extender is to simulate the default copy task of the Installer using the supplied Installer routines.  In Code Listing 3-2 the function reads and writes the atom’s data using the Installer routines ReadSourceData and WriteTargetData.
  1339. Code Listing 3-2    Simple Atom Extender performing a direct copy of an atom’s data.
  1340. ExtenderResultCode main( ExtenderPBPtr        extenderPBPtr )
  1341. {
  1342.     OSErr                        theErr;
  1343.     long                        dataLen;
  1344.     Ptr                        theBufferPtr;
  1345.     ExtenderResultCode    resultCode;
  1346.     // -- Initalize some important variables
  1347.     dataLen = 30000;
  1348.     theErr = noErr;
  1349.     // -- Depending on the message, perform the proper task
  1350.     switch( extenderPBPtr->fFileCopyPBRec.fEnvironmentHeader.fMessageID ) {
  1351.         case kBeforePart:
  1352.         
  1353.             // -- Create a buffer
  1354.             theBufferPtr = NewPtr(dataLen);
  1355.         
  1356.             // -- Check that we got our buffer successfully
  1357.             if( theBufferPtr != NULL && MemErr() == noErr ) {
  1358.         
  1359.                 // -- Read as much as we can up to the size of the buffer.
  1360.                 theErr = ReadSourceData( &dataLen, theBufferPtr);
  1361.                 // -- Loop while there is more data to read. 
  1362.                 while( dataLen > 0 ) {
  1363.         
  1364.                     // -- This is where we can massage the data before writing it out.
  1365.                     //        For example, if the source files were compressed, this is 
  1366.                     //        where we might call our decompression routine.
  1367.                     // -- Write the data out.
  1368.                     theErr = WriteTargetData( dataLen, theBufferPtr);
  1369.                     // -- Read as much as we can up to the size of the buffer.
  1370.                     if( theErr == noErr ) {
  1371.                         theErr = ReadSourceData( &dataLen, theBufferPtr);
  1372.                         
  1373.                         // -- If we got eofErr, then we know we're done,
  1374.                         //         and dataLen will be 0 (zero).
  1375.                         if( theErr == eofErr )
  1376.                             theErr = noErr;
  1377.                     }
  1378.                     
  1379.                 } // while not done copying
  1380.                 if( theErr == noErr )
  1381.                     resultCode = kCopiedData;
  1382.                 else
  1383.                     resultCode = kFatalError;
  1384.                 // -- Dispose the buffer
  1385.                 DisposPtr(theBufferPtr);
  1386.             }
  1387.             else
  1388.                 resultCode = kFatalError;
  1389.             break;
  1390.     
  1391.         // -- For this example, we ignore the other messages.
  1392.         case kInitialize:
  1393.         case kAfterPart:    
  1394.         case kSuccess:    
  1395.         case kCancel:
  1396.             resultCode = kContinueAsNormal;
  1397.             break;
  1398.     }
  1399.     
  1400.     return resultCode;
  1401. }
  1402. Once the code in Code Listing 3-2 has been compiled into a code resource, it can be called from any atom and will copy the atom’s data as if the Installer had performed the copy.  This also works for atoms whose source pieces have been split across multiple source disks, because the Installer keeps track of where each source piece should be written in the target file.  The Installer data routines are similar to high-level File Manager routines:
  1403. n    ReadSourceData — Similar to FSRead.
  1404. n    WriteTargetData — Similar to FSWrite.
  1405. n    SetTargetDataPos and SetSourceDataPos — Similar to SetFPos.
  1406. n    GetTargetDataPos and GetSourceDataPos — Similar to GetFPos.
  1407. n    GetTargetDataEOF and GetSourceDataEOF — Similar to GetEOF.
  1408. One of five messages can be sent to the Atom Extender.  Flags in the ‘inex’ resource specify which messages the Atom Extender wishes to receive.  The Atom Extender writer can examine the fMessageID field in the parameter block to determine which message has been sent.  The following messages have been defined:
  1409. n    kInitialize — Sent after the user clicks the Install button and preflighting has successfully completed.
  1410. n    kBeforePart — Sent after the Installer has opened the atom’s source file and is about to copy the atom’s data.
  1411. n    kAfterPart — Sent after the atom’s data has been successfully copied.
  1412. n    kSuccess — Sent after the entire installation has successfully completed.
  1413. n    kCancel — Sent after an installation was stopped due to an error or cancelation by the user, Action Atom or Atom Extender.
  1414. The Atom Extender must return a result telling the Installer what to do after receiving each message.  The result codes, kFatalError, kContinueAsNormal, kCancelInstallation can be returned for any message.  If you do not want to change the default action of the Installer, return kContinueAsNormal; otherwise, return kFatalError or kCancelInstallation to stop the installation.  If the message was kBeforePart and you’ve copied the data yourself (with or without the supplied Installer routines) then return kCopiedData.
  1415. Memory Allocation within Atom Extenders
  1416. When the Atom Extender is executed, memory allocated using Macintosh OS/Toolbox routines will come from a sub-heap created by the Installer.  The size of the sub-heap is determined by the requested free memory field of the ‘inex’ resource, and the available room in the Installer’s heap.  You must check the actual size of the heap to make sure you were allocated all of the memory you requested, since the Installer calls you whether or not all your request was allocated.  This helps the Installer maintain better control over all memory allocation.
  1417. The scriptwriter may need to adjust the size of the Installer’s partition to make sure enough memory is always available for the Atom Extender’s needs.  The following equation helps determine the Installer’s partition size for the required free memory and other factors.
  1418.     runTimeSize = size of the largest:  ‘FOND’ resource, Desk Accessory resource, or owned resource being copied. 
  1419.     extenderSize = largest required free memory of any Atom Extender + code size of all Atom Extenders,  in use during an installation + the total amount of static memory allocated.
  1420.     scriptSize = the uncompressed size of the script
  1421.     estimated partition size = (the larger of: runTimeSize, extenderSize) + scriptSize + 350K
  1422. Installer 4.0 provides memory management routines of its own to allow Atom Extenders to use available memory from the MultiFinder and Installer heaps.  These routines are very similar to the Memory Manager calls, but are needed to maintain compatibility with pre-7.0 MultiFinder temporary memory calls.
  1423. n    INewHandle — Similar to NewHandle, but always use IDisposHandle to dispose this handle, and IHLock and IHUnlock to lock and unlock this handle.  The handle may or may not have been allocated in the MultiFinder heap.
  1424. n    IDisposHandle — Similar to DisposHandle.
  1425. n    IHLock — Similar to HLock.
  1426. n    IHUnlock — Similar to HUnlock.
  1427. The INewHandle routine has been provided for two main purposes.  The first purpose is to allow access to extra memory, when available, to make the actions of an Atom Extender more efficient.  The second purpose is to allow memory to be maintained over invocations of an Atom Extender. 
  1428. Running within a Sub-Heap
  1429. A sub-heap for memory allocation is mandatory for Atom Extenders to prevent gridlock when buffering data.  Sub-heaps are optional for the other code resources that can be called during an installation, such as search procedures, Action Atoms and rule functions.   We suggest some do’s and don’ts on dealing with sub-heaps below.
  1430. DO’s:
  1431. n    Sub-heaps are mandatory for Atom Extenders, but other code resources can run inside the Installer’s heap, so enter 0 (size) as the request memory size if you don’t want to bother with sub-heaps.
  1432. n    Set the current zone to the application heap before calling any Toolbox routine, and restore it afterwards.  This assures that memory allocated within these calls won’t get left in your sub-heap.
  1433. n    Use the Installer’s memory routines, unless you want the memory allocated directly from your sub-heap.
  1434. DON’Ts:
  1435. n    Watch out for memory that is left in the sub-heap after you return control to the Installer that the system may have references to.  If you set the current zone to the application heap before calling any Toolbox routine you shouldn’t have any problems.  For example, if you  call the GetResource routine (without properly setting the zone) that allocates a handle inside your sub-heap the Installer may crash after returning control to the Installer
  1436. n    Never return a reference to a handle allocated in your sub-heap for the fStaticDataHdl field.  Since the sub-heap is destroyed between invocations of the code resource, it’s best to use INewHandle to allocate any handle you store in the fStaticDataHdl field. 
  1437. n    Never assume you received a sub-heap of the full size requested.  Check that you have enough memory enough to complete your task, since the Installer calls you whether or not your full request was allocated.  Look for warning messages in the Installer Debugger to help identify this situation. 
  1438. Converting Existing Decompression Code
  1439. Conversion is simple for those decompressors that access files using standard File Manager calls.  The Installer routines have been designed to easily replace calls to the high-level File Manager routines: FSRead, FSWrite, SetFPos, GetFPos and GetEOF.
  1440. If your decompression code must use a temporary file to store partially decompressed data, then it’s up to you to create and destroy this file.  Space on the target disk can be reserved by adding the needed space to one File Atom installed to the target disk.  As an alternative, the Installer INewHandle routine can be used to allocate a temporary buffer if sufficient memory exists, but the availability of this memory is never guaranteed. 
  1441. If your original decompression code comes from an application and you are using the MPW development system, make sure to read Tech. Note #256.  To access global data you will need to create your own A5 world and switch back to the Installer’s A5 world before calling any Installer routine or Mac Toolbox trap.  Avoiding global data makes writing code resources easier unless your development system (i.e. THINK C) supports using the A4 register to access global data.
  1442. Atom Extender Reference
  1443. This section describes the data structures and routines that are used by Atom Extenders.  You’ll need to include the interface file “AtomExtenderHeader.h” or “AtomExtenderHeader.p” to have access to these data structures and routines.
  1444. Resource Description
  1445. Information about how to call the Atom Extender code resource is contained in the script resource of type ‘inex’.  New versions of File Atoms, Resource Atoms and Font Atoms reference the ‘inex’ resource using its resource ID.  The resource has the template:
  1446. #define    atomExtenderFlags                                                    \
  1447.         boolean        dontSendInitMessage, sendInitMessage;            \
  1448.         boolean        dontSendBeforeMessage, sendBeforeMessage;        \
  1449.         boolean        dontSendAfterMessage, sendAfterMessage;        \
  1450.         boolean        dontSendSuccessMessage, sendSuccessMessage;    \
  1451.         boolean        dontSendCancelMessage, sendCancelMessage;        \
  1452.         boolean        continueBusyCursors, suspendBusyCursors;        \
  1453.         fill bit[10];
  1454. type 'inex' {
  1455.         switch {
  1456.             case format0:
  1457.                 key integer = 0;            /* Extender Format version */
  1458.                 atomExtenderFlags;        /* Flags for Format 0 */
  1459.                 unsigned longInt;            /* Code resource Type */
  1460.                 integer                        /* Code resource ID */
  1461.                 longInt;                        /* Refcon Value */
  1462.                 longInt;                        /* Required Free Memory */
  1463.                 evenPaddedString;            /* Status Description */    
  1464.         };
  1465. };
  1466. Flag descriptions
  1467. sendInitMessage    Asks to send an kInitialize message to those Atom Extenders attached to atoms that will be executed during the installation.  The Atom Extender receives the kInitialize message after each time the user clicks the Install button and preflighting is successful.  The purpose of the kInitialize message is to allocate any static memory needed to communicate between Atom Extenders.
  1468. sendBeforeMessage    Asks to send a kBeforePart message to the Atom Extender code resource when the atom part is ready to be copied.  The Installer has found and opened the source file that the part exists in and is ready to begin buffering the source data.  The Atom Extender can override the Installer’s default copy mechanism by using the supplied routines and returning a kCopiedData result code.
  1469. sendAfterMessage    Asks to send an kAfterPart message to the Atom Extender code resource for each part that has been successfully written by the Installer or Atom Extender.  An kAfterPart message is only sent if the Installer performed the copy or the Atom Extender called WriteTargetData (with data length greater than 0) during a kBeforePart message.
  1470. sendSuccessMessage    Asks to send a kSuccess message to the Atom Extender code resource after the entire installation has successfully completed.  The purpose of the kSuccess message is to allow disposal of any static memory allocated during the kInitialize message, and delete any temporary files that were created by the Extender. Only those Atom Extenders that received kInitialize messages will be sent a kSuccess message.  
  1471. sendCancelMessage    Asks to send a kCancel message to the Atom Extender code resource when the user cancels the installation, an error forces the installation to stop, or an Atom Extender cancels the installation.  The purpose of the kCancel message is to reverse any changes that were made during the installation, and dispose of any static memory allocated during the kInitialize message.  Only those Atom Extenders that received kInitialize messages will be sent a kCancel message.
  1472. Field descriptions
  1473. Code Resource Type    The resource type of the Atom Extender code resource to be called.  (4-bytes) 
  1474. Code Resource ID    The resource ID of the Atom Extender code resource to be called.  (2-bytes) 
  1475. RefCon Value    The value that will be passed in the fRefCon field of the Atom Extender parameter block.  (4-bytes) 
  1476. Required Free Memory    The minimum number of free bytes the Atom Extender needs in its own heap to make local allocation of memory using Macintosh OS/Toolbox routines.  (4-bytes) 
  1477. Status Description    An optional string that is displayed in the Status dialog during execution of the Atom Extender. (even-padded Pascal string) 
  1478. Data Structures
  1479. Function Interface
  1480. The entry point of the Atom Extender code resource must have the interface:
  1481. ResultCode    MyAtomExtender(ExtenderPBPtr    myExtenderPBPtr);
  1482. The Atom Extender should return a result telling the Installer what to do after executing the code resource.  You can use these constants to specify the result code:
  1483. typedef enum {
  1484.     kFatalError = -1,                /* Stop installation with error user dialog. */
  1485.     kContinueAsNormal = 0,        /* Request default action from Installer. */
  1486.     kCancelInstallation = 1,    /* Cancel installation with cancel user dialog. */
  1487.     kCopiedData = 2                /* Override default copy on kBeforePart message. */
  1488. } ResultCode;
  1489. Parameter Block
  1490. The AtomExtender parameter block contains information about the atom being installed.  Most Atom Extenders will only need to reference a few fields from this parameter block.  The parameter block has the structure:
  1491. typedef  struct {
  1492.     ExtenderMessageID    fMessageID;
  1493.     Handle                fStaticDataHdl;
  1494.     ProcPtr                fCallBackProcPtr;
  1495.     short                    fTargetVRefNum;
  1496.     long                    fTargetFolderDirID;
  1497.     short                    fSystemVRefNum;
  1498.     long                    fSystemBlessedDirID;
  1499.     long                    fRefCon;
  1500.     DataType                fDataType;
  1501. } EnvironsHeaderRec;
  1502. typedef  struct {
  1503.     FSSpec                fSourceFile;
  1504.     FSSpec                fTargetFile;
  1505.     long                    fTotalTargetSize;
  1506.     long                    fTargetPosStart;
  1507.     long                    fTargetPartSize;
  1508.     long                    fSourcePartSize;
  1509.     long                    fInstallerTempDirID;
  1510. } CopyHeaderRec;
  1511. typedef  struct {
  1512.     EnvironsHeaderRec        fEnvironmentHeader;
  1513.     CopyHeaderRec            fCopyPBHeader;
  1514. } BasicCopyRec;
  1515. typedef  struct {
  1516.     EnvironsHeaderRec        fEnvironmentHeader;
  1517.     CopyHeaderRec            fCopyPBHeader;
  1518.     ResType                    fSourceRsrcType;
  1519.     short                        fSourceRsrcID;
  1520.     ResType                    fTargetRsrcType;
  1521.     short                        fTargetRsrcID;
  1522.     Str255                    fTargetRsrcName;
  1523.     short                        fTargetRsrcAttrs;
  1524. } RsrcCopyRec;
  1525. typedef  struct {
  1526.     EnvironsHeaderRec        fEnvironmentHeader;
  1527.     TCopyHeaderRec            fCopyPBHeader;
  1528.     ResType                    fSourceFontRsrcType;    /* usually ‘part’ */
  1529.     short                        fSourceFontRsrcID;
  1530.     ResType                    fTargetFontRsrcType;    /* FONT, NFNT, or sfnt */
  1531.     short                        fTargetFontRsrcID;
  1532.     Str255                    fTargetFontRsrcName;
  1533.     short                        fTargetFontRsrcAttrs;
  1534.     Str255                    fFamilyName;
  1535.     short                        fFamilyID;
  1536.     short                        fFontSize;
  1537.     short                        fFontStyle;
  1538. } FontCopyRec;
  1539. typedef union {
  1540.     BasicCopyRec            fBasicPBRec;
  1541.     BasicCopyRec            fFileCopyPBRec;
  1542.     RsrcCopyRec            fRsrcCopyPBRec;
  1543.     FontCopyRec            fFontCopyPBRec;
  1544. } ExtenderPBRec, *ExtenderPBPtr;
  1545. Field descriptions 
  1546. fMessageID    One of five messages the Atom Extender will receive when being called. Use these constants to understand the message ID:
  1547.     typedef enum {
  1548.     kInitialize = 0,
  1549.     kBeforePart    = 1,
  1550.     kAfterPart    = 2,
  1551.     kSuccess     = 3,
  1552.     kCancel    = 4
  1553. } ExtenderMessageID;
  1554.     Certain fields in the Atom Extender parameter block may or may not be valid when receiving a specific message.  Each of the following field descriptions include a note about when the field is valid.
  1555. fStaticDataHdl    A handle created by the Atom Extender using INewHandle to save information between calls to this Atom Extender code resource.  The field is always NULL when receiving an kInitialize message.  You can assign a value to this field during any call to the Atom Extender, and receive the same value in this field during the next message.  (Valid for all messages.)
  1556. fCallBackProcPtr    A pointer to the Installer’s dispatcher routine.  You’ll need to pass this field as a parameter to glue routines that provide access to Installer functions.  (Valid for all messages.)
  1557. fTargetVRefNum    The target disk’s vRefNum.  When allowing the user to select a target application folder, this is the volume on which the folder resides.  (Valid for all messages.)
  1558. fTargetFolderDirID    The target application folder’s directory ID.  This value is -1 if the user cannot select a target application folder.  Target File Specs that use the reserved folder path folder-user will be placed in this folder.  (Valid for all messages.)
  1559. fSystemVRefNum    The System disk’s vRefNum.  Target File Specs that use the reserved folder path special-xxx will be placed in the System Folder on this volume.  (Valid for all messages.)
  1560. fSystemFolderDirID    The directory ID of the System Folder on the disk with the refNum fSystemVRefNum.  This directory is not necessarily the currently active System Folder.  (Valid for all messages.)
  1561. fRefCon    A 4-byte value defined by the scriptwriter in the ‘inex’ script resource.  (Valid for all messages.)
  1562. fDataType    One of five values that specifies the type of data the Atom Extender has been given.  Use this value to determine which type of atom is being installed, and which variant of the parameter block should be used.  Use these constants to understand the data type: 
  1563.     typedef enum { 
  1564.     kFileAtomDataFork            = 0,
  1565.     kFileAtomRsrcFork            = 1,
  1566.     kFileAtomRsrcForkInDataFork    = 2,
  1567.     kRsrcAtom                = 3,
  1568.     kFontAtom                = 4
  1569. } DataType;
  1570.     (Valid for all messages.)
  1571. fSourceFile    An FSSpec record specifying the source file from which the source data is read.  (Valid only for kBeforePart and kAfterPart messages.)
  1572. fTargetFile    An FSSpec record specifying the target file to which the target data is written.  (Valid only for kBeforePart and kAfterPart messages.)
  1573. fTotalTargetSize    The number of bytes all source pieces will occupy in the target.  (Valid only for kBeforePart and kAfterPart messages.)
  1574. fTargetPosStart    The offset in bytes into the target data the part’s data is written.  (Valid only for the kBeforePart and kAfterPart messages.)
  1575. fTargetPartSize    The size in bytes the part’s data will occupy in the target.  (Valid only for the kBeforePart and kAfterPart messages.)
  1576. fSourcePartSize    The size in bytes the part’s data occupies in the source.  (Valid only for the kBeforePart message.)
  1577. fInstallerTempDirID    The directory ID of the Installer temp folder on the target’s volume that contains the original target file.  If this field is -1, the original file was not saved or did not exist.  You can get the target’s volume refNum from the fTargetFile field.  (Valid only for the kBeforePart and kAfterPart messages.)
  1578. Field descriptions for Resource Atoms
  1579. fSourceRsrcType    The resource type of the source resource part.  (Valid only for kBeforePart and kAfterPart messages.)
  1580. fSourceRsrcID    The resource ID of the source resource part.  (Valid only for kBeforePart and kAfterPart messages.)
  1581. fTargetRsrcType    The resource type of the target resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1582. fTargetRsrcID    The resource ID of the target resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1583. fTargetRsrcName    The resource name to be given to the target resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1584. fTargetRsrcAttrs    The resource attributes to be given to the target resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1585. Field descriptions for Font Atoms
  1586. fSourceFontRsrcType    The resource type of the source font resource part.  (Valid only for kBeforePart and kAfterPart messages.)
  1587. fSourceFontRsrcID    The resource ID of the source font resource part.  (Valid only for kBeforePart and kAfterPart messages.)
  1588. fTargetFontRsrcType    The resource type of the target font resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1589. fTargetFontRsrcID    The resource ID of the target font resource, which is not known until the part has been written by the Installer.  (Valid only for the kAfterPart messages.)
  1590. fTargetFontRsrcName    The resource name to be given to the target font resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1591. fTargetFontRsrcAttrs    The resource attributes to be given to the target font resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1592. fFamilyName    The family name (i.e. “Times”, “Geneva”… ).  The source ‘FOND’ resource can be found using this name.  (Valid only for kBeforePart and kAfterPart messages.)
  1593. fFamilyID    The family ID.  Normally this is the resource ID of the ‘FOND’ resource.  (Valid only for kBeforePart and kAfterPart messages.)
  1594. About Version Compare Functions (‘invc’)
  1595. Version Compare functions allow external code resources to be called when the target file or resource’s version must be determined in order to compare with the source version number supplied in the script. 
  1596. The Installer 3.X versions allow the scriptwriter to specify how it should handle the case where the target file is newer than the source file.  This usually prevents downgrading the user’s software, but the opposite case may occur where downgrading is required to maintain sync-ed versions of software.  Previously, the determination of “newness” was dependent on comparing the creation dates of the target file to the value in the source ‘infs’ resource.  This works most of the time, but is not a reliable way to compare files.
  1597. All files being installed should have a version resource (‘vers’ 1 and maybe a ‘vers’ 2), and the ability to “newness” of files based on version resource is a desirable feature.  Installer 4.0 now provides three ways to compare files:
  1598. n    Old way using creation date.  Use the useSrcCrDateToCompare flag in the File Atom.
  1599. n    Default version number comparison using the ‘vers’ 1 resource in the target file.  Use the useVersProcToCompare flag in the File Atom.  Place the source version number in the Source Version Number field and place 0 (zero) in the Version Compare Rsrc ID field of the File Atom.
  1600. n    Custom determination of the target version number of a file or resource using a code resource.  Use the useVersProcToCompare flag in the File Atom.  Place the source version number in the Source Version Number field and place the ‘invc’ resource ID in the Version Compare Rsrc ID field of the File Atom or Resource Atom.
  1601. Using Version Compare Functions with File Atoms
  1602. During preflighting of the target disk the Installer will call the Version Compare code resource for each existing target file that references a valid ‘invc’ script resource.  Upon entering the code resource the current resource file will have been set to the target file, so the code resource can easily make Resource Manager calls to read an alternative version resource.  If the version information is stored in the data fork, or in another file the code resource must open and close the file themselves.
  1603. The Compare Version code resource must return the version number as the function result.  If an error occurs while finding the version number, then return 0 (zero).
  1604. Allowable Installer functions when comparing the version of a file:
  1605. n    Memory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  1606. n    Action Handler function:  RegisterAction.
  1607. Using Version Compare Functions with Resource Atoms
  1608. During preflighting of the target disk the Installer will call the Version Compare code resource for each existing target resource that references a valid ‘invc’ script resource.  Upon entering the code resource the current resource file will have been set to the file the target resource resides.  The code resource should call the Installer’s ReadTargetData routine to read from the target resource.  This should allow most resource version schemes using a header to easily and quickly determine the version number of the resource.  Using Resource Manager calls should be avoided. 
  1609. The Compare Version code resource must return the version number as the function result.  If an error occurs while finding the version number, then return 0 (zero).
  1610. Allowable Installer functions when comparing the version of a resource:
  1611. n    Memory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  1612. n    Target functions:  ReadTargeData, GetTargeDataEOF, GetTargeDataPos, SetTargeDataPos.
  1613. n    Action Handler function:  RegisterAction.
  1614. Version Compare Runtime Environment
  1615. The Version Compare code resource shares memory space with the Installer.  Local memory allocation using Memory Manager calls will come from the Installer’s heap.  Please be nice to our heap.
  1616. Version Compare Function Reference
  1617. This section describes the function interface and resource descriptions needed to use the Version Compare script resource.
  1618. Function Interface
  1619. The Installer calls your Version Compare code resource assuming the following function interface.
  1620. long ComputeVersionNumber( ComputeVersionPBPtr );
  1621. The Version Compare function writer must return a version number.  The version number consists of four bytes defined from the high byte as:  major revision level, minor revision level, development stage, and prerelease revision level.  See Inside Macintosh:  Macintosh Toolbox Essentials, page 7-31 for more details.
  1622. Parameter Block
  1623. The version compare code resource is passed a pointer to a parameter block containing the callback pointer.
  1624. typedef  struct {
  1625.     ProcPtr            fCallBackProcPtr;
  1626. } ComputeVersionPB, *ComputeVersionPBPtr;
  1627. Field descriptions 
  1628. fCallBackProcPtr    A pointer to the Installer’s dispatch routine.  You’ll need to pass this field as a parameter to Installer function glue routines.
  1629. Resource Description
  1630. The template of the Version Compare script resource is shown below.
  1631. #define    versionCompareFlags        \
  1632.         fill bit[16];
  1633. type 'invc' {
  1634.         switch {
  1635.             case format0:
  1636.                 key integer = 0;        /* Format version */
  1637.                 versionCompareFlags;    /* Version Compare */
  1638.                 literal longint;        /* Version Compare Code Rsrc Type */
  1639.                 integer;                    /* Version Compare Code Rsrc ID */
  1640.                 longint;                    /* Minimal Requested Memory */
  1641.                 evenPaddedString;        /* Summary */    
  1642.         };
  1643. };
  1644. Field descriptions 
  1645. Version Compare Flags     Currently reserved for use by Apple Computer, Inc.  (2-bytes)
  1646. Version Compare Code Rsrc Type
  1647. The resource type of the Version Compare code resource.  (4-bytes)
  1648. Version Compare Code Rsrc ID
  1649. The resource ID of the Version Compare code resource.  (2-bytes)
  1650. Minimal Required Memory    The minimum number of free bytes the Version Compare code resource needs during execution.  (4-bytes) 
  1651.             NOTE
  1652.                 Unless your Version Compare routine has a special need for                 it's own memory heap, you should always assign this field a                 value of zero. A value of zero allows the Version Compare                 routine to use the Installer’s allocated memory.u
  1653. Version Compare Summary    An optional string briefly describing the purpose of this Version Compare function.  This string is never displayed to the user.  (even-padded Pascal string) 
  1654.  
  1655. Installer Rules
  1656. This chapter describes how to use Frameworks, Rules and Rule Clauses to make intelligent installation recommendations to the user. 
  1657. Frameworks (‘infr’)
  1658.  Rules are evaluated when the Installer is launched; and, when needed, while the user is interacting with the interface.
  1659. Times when rules are evaluated: 
  1660. n    The rules are first evaluated immediately after the user dismisses the splash screen.  If no splash screen is provided, then before showing the Easy Install or Custom Install dialog.
  1661. n    The user selects a different target disk, application folder or system disk while in Easy Install or Custom Install.
  1662. n    The user returns to the Installer from another application when running in a MultiFinder environment.
  1663. n    The currently selected target disk changes because the user clicks the Eject Disk button, or inserts a disk, or the disk goes offline because of a network failure or system activity.
  1664. Global Rule Framework
  1665. The global framework provides common rules between the custom install and the easy install frameworks.  The global framework will always be executed before the easy install or custom install frameworks.  It allows smaller and simpler scripts by allowing the other frameworks to refer to assertions set in the global framework.  All rule clauses can be called in the global framework, but those not relevant to the interface mode are ignored.  The global framework is located by looking for an ‘infr’ resource of ID 765.  
  1666. Easy Install Rule Framework
  1667. The Easy Install rule framework provides control over the message area in the Easy Install screen.  When the Installer finds and opens the script, the Easy framework is located by looking for an ‘infr’ resource that does not have the ID of 765 or 766.  This is to provide compatibility with Installer 3.4.X scripts that can use any ID for their ‘infr’ resource.  It is recommended that the Easy framework resource have the ID of 764.
  1668. Custom Install Rule Framework
  1669. The Custom Install rule framework provides control over items shown in the Custom Install list.  When the Installer finds and opens the script, a Custom framework is located by looking for an ‘infr’ resource of ID 766.  If one is not found, the Installer uses the Installer 3.X method of determining which packages should be shown in the Custom Install list.
  1670. When a Custom Install framework is found in the script, the scriptwriter must call the new rule clause AddCustomItem for each top-level item to be displayed in the Custom Install list.  The AddCustomItem rule clause accepts a list of the package (‘inpk’) IDs.  The items will be listed in the order they are added.  Sub-packages with the showsOnCustom flag set will automatically be added at the appropriate levels in the hierarchical Custom Install list.
  1671. Like the Easy Install framework, the Custom Install framework executes every time the user switches to Custom Install, changes the target disk/folder selection, or brings the Installer forward.  
  1672. Rules (‘inrl’)
  1673. Rules, which are organized by the rule framework, provide the intelligence for making the Easy Install interface possible.  Rules can examine the installation environment, save information about the installation environment to simplify other rules, provide information to the user about what the Easy Install will do for them, report errors, and/or determine which packages will be used in the Easy Install process.
  1674. Rules are composed of one or more clauses.  Each clause returns a boolean value.  The first clause that returns FALSE terminates the rule.  If the terminated rule is part of a pickFirst set in the rule framework then the following rule, if any, is evaluated.  If all of the clauses in a rule return TRUE, the rule is said to fire.  If the firing rule is part of a pickFirst set in the rule framework then no more rules in the set are evaluated.
  1675. Clauses can be combined to develop the equivalent of an if-then statement.  For example, the if-then statement:
  1676. IF the chosen target is a floppy disk 
  1677. THEN use the package named floppyInstall in the Easy Install
  1678. would be written as a rule as follows:
  1679. resource 'inrl' (rFloppyInstall) {
  1680.     format0 {{
  1681.         checkTgtVolSize {floppy, floppy},    <-- A Clause
  1682.         addPackages {{pFloppyInstall}}        <-- Another Clause
  1683.     }};
  1684. };
  1685. The scriptwriter defines the constants rFloppyInstall and pFloppyInstall earlier in the script (for example: #define rFloppyInstall 1000).  This rule has two clauses.  The first clause, checkTgtVolSize returns TRUE if the currently chosen target volume is a floppy.  If checkTgtVolSize returns TRUE, the second clause is evaluated.  This second clause, addPackages, always returns TRUE, but also has the effect of adding the package whose ID is pFloppyInstall to the list of packages to be used in the Easy Install.  So, if the first clause is TRUE, the addPackages clause will be TRUE and the rule will fire.
  1686. Clauses can be ANDed together.  For example, we could write:
  1687. IF the chosen target is a floppy disk
  1688.     AND we are installing on a Mac+
  1689. THEN return the package named floppyInstall to Easy Install
  1690.     AND add “• Mac+ Floppy Installation” to the Easy Install text
  1691. as
  1692. resource 'inrl' (rFloppyInstall) {
  1693.     format0 {{
  1694.         checkTgtVolSize {floppy, floppy},
  1695.         checkGestalt {gestaltMachineType, {gestaltMacPlus}},
  1696.         addPackages {{pFloppyInstall}},
  1697.         addUserDescription {'• Mac+ Floppy Installation'}
  1698.     }};
  1699. };
  1700. This rule has four clauses.  If the first two return TRUE (i.e., we are installing onto a floppy and the current machine is a Mac Plus) then the second two clauses will be evaluated.  Note that the clauses addPackages and addUserDescription always return TRUE.
  1701. For a more complete example, suppose you wanted to add a piece of text to the Easy Install message which described the machine you were installing onto.  The pseudo code is as follows:
  1702. IF (Machine=Plus) THEN
  1703.     Return the message 'Installing onto your Macintosh Plus'
  1704. ELSE IF (Machine=SE) THEN 
  1705.     Return the message 'Installing onto your Macintosh SE
  1706. ELSE IF (Machine=II) THEN
  1707.     Return the message 'Installing onto your Macintosh II'
  1708. The rule framework is as follows:
  1709. resource 'infr' (kEasyInstallFrameworkRsrcID ) {
  1710.     format0 {{
  1711.         pickFirst, {rPlusUD, rSEUD, rIIUD},
  1712.     }}
  1713. };
  1714. The rules which this framework references are as follows:
  1715. resource 'inrl' (rPlusUD) {
  1716.     format0 {{
  1717.         checkGestalt {gestaltMachineType, {gestaltMacPlus}},
  1718.         addUserDescription {'Installing onto your Macintosh Plus'}
  1719.     }};
  1720. };
  1721. resource 'inrl' (rSEUD) {
  1722.     format0 {{
  1723.         checkGestalt {gestaltMachineType, {gestaltMacSE}},
  1724.         addUserDescription {'Installing onto your Macintosh SE}
  1725.     }};
  1726. };
  1727. resource 'inrl' (rIIUD) {
  1728.     format0 {{
  1729.         checkGestalt {gestaltMachineType, {gestaltMacII}},
  1730.         addUserDescription {'Installing onto your Macintosh II}
  1731.     }};
  1732. };
  1733. The constants, rPlusUD, rSEUD, and rIIUD would be defined in the script before being used.
  1734. Using Assertions
  1735. It is often useful to keep track of information about the type of installation that is being done.  This allows a more natural script organization.  Note:  The Installer clears all assertions prior to firing rules.  Suppose, for example, that many of the rules in a script depended on knowing whether an update or a new install was being done.  The pseudocode for this is as follows:
  1736. IF System File Exists
  1737.     AND Installing on Mac+
  1738. THEN Use Mac+ Update packages
  1739. IF System File Exists
  1740.     AND Installing on MacSE
  1741. THEN Use MacSE Update packages
  1742. More conveniently (and with better performance):
  1743. IF System File Exists
  1744. THEN Assert(updating)
  1745. IF updating
  1746.     AND Installing on Mac+
  1747. THEN Use Mac+ Update packages
  1748. IF updating
  1749.     AND Installing on MacSE
  1750. THEN Use MacSE Update packages
  1751. Assertions provide this functionality.  Using assertions is a three-step process:  1) define a unique constant for the assertion, 2) set the assertion using an AddAssertion clause, and 3) check the assertions via CheckAllAssertions, CheckAnyAssertion, CheckMoreThanOneAssertion, CheckAllNonAssertions, or CheckAnyNonAssertion clauses.  The above example is written as follows:
  1752. #define aUpdating    1                                    <-- uniquely defined
  1753. resource 'infr' (kEasyInstallFrameworkRsrcID) {
  1754.     format0 {{
  1755.         pickAll, {rCheckUpdate, rSEUpdate, rIIUpdate},
  1756.     }}
  1757. };
  1758. resource 'inrl' (rCheckUpdate) {
  1759.     format0 {{
  1760.         checkFileRsrcForkExists {fsSystemFile},
  1761.         addAssertion {{aUpdating}}                    <-- set it
  1762.     }};
  1763. };
  1764. resource 'inrl' (rSEUpdate) {
  1765.     format0 {{
  1766.         checkAllAssertions {aUpdating},            <-- check it
  1767.         checkGestalt {gestaltMachineType, {gestaltMacSE}},
  1768.         addPackages {{pSEUpdate}}
  1769.     }};
  1770. };
  1771. resource 'inrl' (rIIUpdate) {
  1772.     format0 {{
  1773.         checkAllAssertions {aUpdating}            <-- check it
  1774.         checkGestalt {gestaltMachineType, {gestaltMacII}},
  1775.         addPackages {{pIIUpdate}}
  1776.     }};
  1777. };
  1778. Rule Clause Reference
  1779. This section describes the available rule clauses.
  1780. #define kEasyInstallFrameworkRsrcID     764
  1781. #define kCustomInstallFrameworkRsrcID     766
  1782. #define kGlobalFrameworkRsrcID             765
  1783. Global Rule Clauses
  1784. CheckGestalt
  1785. CheckGestalt { gestaltSelector, {gestaltReturnValuesList} }
  1786. gestaltSelector    A selector value specifying the type of system information to check.  (4-bytes)
  1787. gestaltReturnValuesList    A list of Gestalt return values. If the Gestalt result matches one of the values in the list the function will return TRUE.  (4-bytes)
  1788. DESCRIPTION
  1789. Use the CheckGestalt clause to check a Gestalt attribute.  CheckGestalt takes two arguments:  a Gestalt selector, and a list of valid Gestalt return values.  The Installer calls Gestalt with the given selector.  If the Gestalt return value is in the list of valid return values, checkGestalt returns TRUE.
  1790. NOTE
  1791. If the Gestalt selector specified requires a value containing flags ( or a bit mask ), you should use the CheckGestaltAttributes routine described below. u
  1792. CheckGestaltAttributes
  1793. CheckGestaltAttributes { gestaltSelector, bitMask }
  1794. gestaltSelector    A selector value specifying the type of system information to check.  (4-bytes)
  1795. bitMask    A bit mask that will be AND’ed with actual result from the Gestalt call.  (4-bytes)
  1796. DESCRIPTION
  1797. Use the CheckGestaltAttributes clause to check one or more specific bits in the Gestalt value.  Passing a bit mask with more than one bit set will effectively OR the specified bits in the Gestalt result value.  CheckGestaltAttributes takes two arguments:  a Gestalt selector, and a bit mask.  The Installer calls Gestalt with gestaltSelector, then AND’s the result value with bitMask.  If this value is non-zero then CheckGestaltAttributes returns TRUE.
  1798. CheckMinMemory
  1799. CheckMinMemory{ minimalMemory }
  1800. minimalMemory     The minimal number of megabytes of physical memory. (4-bytes)
  1801. DESCRIPTION
  1802. Use CheckMinMemory to specify the minimal amount of physical memory needed for an installation.  Note that you cannot use CheckGestalt for this job unless you want to list all of the memory configurations applicable for an installation.  CheckMinMemory takes a single argument:  the minimal amount of memory (in MB) needed for this clause to be TRUE.
  1803. CheckFileDataForkExists
  1804. CheckFileDataForkExists{ targetFileSpecRsrcID }
  1805. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1806. DESCRIPTION
  1807. Use CheckFileDataForkExists to determine whether a specific file has a data fork.  It takes a single argument:  the Target File Spec ID of the file you are interested in. CheckFileDataForkExists returns TRUE if the file referenced by the File Spec exists and has a data fork.
  1808. CheckFileRsrcForkExists
  1809. CheckFileRsrcForkExists{ targetFileSpecRsrcID }
  1810. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1811. DESCRIPTION
  1812. Use CheckFileRsrcForkExists to determine whether a specific file has a resource fork.  It takes a single argument:  the Target File Spec ID of the file you are interested in.  It returns TRUE if the file referenced by the File Spec exists and has a resource fork. CheckFileRsrcForkExists is a convenient way to see if a file which contains code exists..
  1813. CheckFileContainsRsrcByID
  1814. CheckFileContainsRsrcByID{ targetFileSpecRsrcID, resourceType, resourceID }
  1815. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1816. resourceType     A resource type.  (4-bytes)
  1817. resourceID     A resource ID.  (2-bytes)
  1818. DESCRIPTION
  1819. Many times it is necessary to determine whether a specific file contains a specific resource.  Use the checkFileContainsRsrcByID clause to determine whether a file has a resource with a known type and ID.  checkFileContainsRsrcByID takes three arguments:  the File Spec ID of the target file, the type of the resource, and the ID of the resource.
  1820. CheckFileContainsRsrcByName
  1821. CheckFileContainsRsrcByName{ targetFileSpecRsrcID, resourceType, resourceName }
  1822. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1823. resourceType     A resource type.  (4-bytes)
  1824. resourceName     A resource name.  (even-padded Pascal string)
  1825. DESCRIPTION
  1826. Use checkFileContainsRsrcByName to determine whether a file has a resource with a known type and name.  checkFileContainsRsrcByName takes three arguments:  the File Spec ID of the target file, the type of the resource, and the name of the resource.
  1827. CheckFileVersion
  1828. CheckFileVersion{ targetFileSpecRsrcID, majorVersNum, minorVersNum, releaseStage, releaseNum}
  1829. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1830. majorVersNum     The major version number.  (2-bytes)
  1831. minorVersNum     The minor version number.  (2-bytes)
  1832. releaseStage     The release stage.  Four release stage constants are defined in the InstallerTypes.r file:  development, alpha, beta, final and release.  (2-bytes)
  1833. releaseNum     The release number.  (2-bytes)
  1834. DESCRIPTION
  1835. Use CheckFileVersion to check the version of a file.  CheckFileVersion takes two arguments:  the filespec ID of the file in question, and the minimal version of the file needed for this clause to be TRUE.  The Installer obtains this information from the file’s 'vers' ID =1 resource.  If no 'vers' resource exists, CheckFileVersion returns FALSE.
  1836. For example, to check for System version 6.0.5 or newer, use the following clause.
  1837.     checkFileVersion{SysFileSpec, 6, 5, release, 0};
  1838. To check for System version 7.1 or newer, use the following clause.
  1839.     checkFileVersion{FinderFileSpec, 7, 0x10, release, 0};
  1840. To check for AppleTalk version 57.0.4 or newer, use the following clause.
  1841.     checkFileVersion{ATalkFileSpec, 0x57, 0x04, release, 0};
  1842. CheckFileCountryCode
  1843. CheckFileCountryCode{ targetFileSpecRsrcID, countryCode }
  1844. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1845. countryCode     A country code.  (2 bytes)
  1846. DESCRIPTION
  1847. Use the CheckFileCountryCode clause to determine a file’s country code (the name 'country code' has recently been changed to region code).  CheckFileCountryCode takes two arguments: the File Spec ID of the file in question, and the country/region code required.  The Installer obtains this information from the file’s 'vers' resource.  The country (MPW 3.1) /region (MPW 3.2) codes can be found in the MPW interface file SysTypes.r.
  1848. CheckTgtVolSize
  1849. CheckTgtVolSize{ minimumSize, maximumSize }
  1850. minimumSize     The minimum size of the volume in Kbytes.  (4-bytes)
  1851. maximumSize     The maximum size of the volume in Kbytes.  (4-bytes)
  1852. DESCRIPTION
  1853. Use the CheckTgtVolSize clause to check target disk size.  Note that this check is for disk size (to distinguish floppy from hard disks), not available disk space.  The Installer itself handles the case where the target has insufficient space to accomplish the installation.  CheckTgtVolSize takes two arguments: the smallest and largest size disks possible.  To match any size disk, the minimal and maximal target disk sizes are both zero.  If the minimum size is greater than zero but the maximum size equals zero, only the minimal requirement is used.  Note that there are three size pairs defined in InstallerTypes.r.  If you use {floppy, floppy} then checkTgtVolSize will return TRUE for 400 or 800k floppy targets.  If you use {hdFloppy, hdFloppy} then checkTgtVolSize will return TRUE for high density floppy (1.4mb) targets.  If you use {hardDisk, hardDisk} then checkTgtVolSize will return TRUE for any target volume of 10mb or greater.
  1854. NOTE
  1855. Since RAM disks may be most any size, make sure your rules handle this situation correctly. u
  1856. CheckRuleFunction
  1857. CheckRuleFunction{ ruleFunctionCodeRsrcID }
  1858. ruleFunctionCodeRsrcID     The resource ID of a RuleFunction resource (‘inrf’).  (2-bytes)
  1859. DESCRIPTION
  1860. Rule functions provide you with the ability to extend the rule-based decision-making scheme using a custom code resource written by you or someone else.  When the CheckRuleFunction clause is evaluated the code resource is called and its return result determines whether the clause returns TRUE or FALSE.  
  1861. To call a rule function code resource, first create a Rule Function resource (‘inrf’) that describes how to call the code resource.  The Rule Function resource is described in the “InstallerTypes.r” file and the code resource can include the file “RuleFunctionHeader.h”.
  1862. When the code resource is called, the code resource receives the parameter block:
  1863. typedef struct {
  1864.     ProcPtr            fCallBackProcPtr;
  1865.     short                fTargetVRefNum;
  1866.     long                fTargetFolderDirID;
  1867.     short                fSystemVRefNum;
  1868.     long                fSystemBlessedDirID;
  1869.     long                fRefCon;
  1870. } RuleFunctionPBRec, *RuleFunctionPBPtr;
  1871. NOTE
  1872. The fTargetFolderDirID field will be -1 if the Installer is using disk mode, the folder does not exist, or a target File Spec referencing the reserved folder path folder-user has not been referenced by in another rule clause prior to calling the CheckRuleFunction rule clause.  u
  1873.  
  1874. The code resource should use the function declaration:
  1875. long    RuleFunction( RuleFunctionPBPtr );
  1876. The function must return either a TRUE or FALSE value.  Constants for these values are defined as:
  1877. #define kTRUERuleFunctionResult    1
  1878. #define kFALSERuleFunctionResult    0
  1879. s    W A R N I N G
  1880. If you choose to create a sub-heap for each invocation of the Rule Function please read the section “Running with a Sub-Heap” within the Atom Extender portion of this document.  You can enter 0 (zero) in the requested memory field to not create a sub-heap and run inside the Installer’s heap.   s
  1881. AddAssertion
  1882. AddAssertion{ { assertionValueList } }
  1883. assertionValueList     A list of 2-byte assertion values that you wish to set.
  1884. DESCRIPTION
  1885. Use the AddAssertion clause to set a list of 1 or more assertions.  AddAssertion takes a list of assertion constants as arguments.  The constants are uniquely defined Rez symbols.  addAssertion always returns TRUE.
  1886. CheckAllAssertions
  1887. CheckAllAssertions{ { assertionValueList } }
  1888. assertionValueList     A list of 2-byte assertion values that you wish to check.
  1889. DESCRIPTION
  1890. Use CheckAllAssertions to check all of the constants a given list are currently asserted.  CheckAllAssertions takes a list of assertion constants as arguments.  checkAllAssertions returns TRUE if all of the items in the list have been asserted.
  1891. CheckAnyAssertion
  1892. CheckAnyAssertion{ { assertionValueList } }
  1893. assertionValueList     A list of 2-byte assertion values that you wish to check.
  1894. DESCRIPTION
  1895. Use CheckAnyAssertion to check if one or more constants are currently asserted.  CheckAnyAssertion takes a list of assertion constants as arguments.  CheckAnyAssertion returns TRUE if one or more of the items in the list have been asserted.
  1896. CheckMoreThanOneAssertion
  1897. CheckMoreThanOneAssertion{ { assertionValueList } }
  1898. assertionValueList     A list of 2-byte assertion values that you wish to check.
  1899. DESCRIPTION
  1900. CheckMoreThanOneAssertion is used to detect whether more than one constant in a list of constants are currently asserted.  CheckMoreThanOneAssertion takes a list of assertion constants as arguments, and returns TRUE if more than one of the constants has been asserted.  CheckMoreThanOneAssertion could be used, for example, to determine whether more than one printer is being installed.  In that case, display a generic message reporting that “printer software” is being installed.
  1901. ClearAssertions
  1902. ClearAssertions{ { assertionValueList } }
  1903. assertionValueList     A list of 2-byte assertion values that you wish to clear.
  1904. DESCRIPTION
  1905. Use the ClearAssertions clause to clear a list of one or more assertions.  ClearAssertions takes a list of assertion constants as arguments.  The constants are uniquely defined Rez symbols.  ClearAssertions always returns TRUE.
  1906. CheckAllNonAssertions
  1907. CheckAllNonAssertions{ { assertionValueList } }
  1908. assertionValueList     A list of 2-byte assertion values that you wish to check.
  1909. DESCRIPTION
  1910. Use CheckAllNonAssertions to check all of the constants a given list are currently not asserted.  CheckAllNonAssertions takes a list of assertion constants as arguments.  CheckAllNonAssertions returns TRUE if all of the items in the list are not currently asserted.
  1911. CheckAnyNonAssertion
  1912. CheckAnyNonAssertion{ { assertionValueList } }
  1913. assertionValueList     A list of 2-byte assertion values that you wish to check.
  1914. DESCRIPTION
  1915. Use CheckAnyNonAssertion to check if one or more constants are currently not asserted.  CheckAnyNonAssertion takes a list of assertion constants as arguments.  CheckAnyNonAssertion returns TRUE if one or more of the items in the list are currently not asserted.
  1916. AddAuditRec
  1917. AddAuditRec{ targetFileSpecRsrcID, selector, value }
  1918. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1919. selector    The selector.  (4-bytes)
  1920. value     The value  (4-bytes)
  1921. DESCRIPTION
  1922. The AddAuditRec clause is used to add a record to a target file’s audit record.  AddAuditRec takes three arguments:  a File Spec ID for the target file, an audit selector, and an audit value.
  1923. CheckAnyAuditRec
  1924. CheckAuditRec{ targetFileSpecRsrcID, auditSelector, {auditValueList} }
  1925. targetFileSpecRsrcID     A Target File Spec resource ID.  (2-bytes)
  1926. auditSelector    The selector.  (4-bytes)
  1927. auditValueList     A list of 4-byte values.
  1928. DESCRIPTION
  1929. The CheckAnyAuditRec clause is used to determine whether a given selector and value have been entered into the audit record of a target file (specified by the File Spec ID).  CheckAnyAuditRec takes three arguments:  a File Spec ID for the target file, an audit selector, and a list of audit values.  If the value found in the audit resource for the specified selector is contained in the list of values the clause returns TRUE.
  1930. ReportVolError
  1931. ReportVolError{ errorString }
  1932. errorString     String to display.  (Pascal String)
  1933. DESCRIPTION
  1934. ReportVolError is used to report an error because of a problem with the target disk (not a hard disk, disk size too small, no system, et cetera).  The ReportVolError clause reports an error message in the Easy Install or Custom Install message area.  ReportVolError always returns TRUE, so it can be called multiple times in a script.  Messages are concatenated, just as with addUserDescription.  Up to four lines can be displayed.  ReportVolError takes a single even-padded Pascal string as an argument.  To insert the name of the volume into the string, place the characters "^O" in the desired place.  
  1935. If the Installer evaluates a ReportVolError clause, the Easy Install or Custom Install dialog displays a caution icon, and the Install button is dimmed.  If you use this clause, the user can still switch volumes.
  1936. NOTE
  1937. Calling ReportVolError from within the global framework may not work correctly for some scripts.  Depending on the rules within the easy or custom framework, the Install button may still be enabled.  To solve this, call ReportVolError from within the easy or custom framework. u
  1938. ReportSysError
  1939. ReportSysError{ errorString }
  1940. errorString     String to display.  (Pascal String)
  1941. DESCRIPTION
  1942. ReportSysError is used to report an error because of a problem with the system the Installer is running on (usually unsupported hardware or a fatal error).  The ReportSysError clause reports an error message to the Easy Install or Custom Install screen, which ever shows first.  ReportSysError always returns TRUE, so it can be called multiple times in a script.  Up to four lines can be displayed.  Messages are concatenated, just as with AddUserDescription.  ReportSysError takes a single even-padded Pascal string as an argument.  If the Installer evaluates a ReportSysError clause, the Easy Install or Custom Install dialog displays a caution icon, and the Install button is dimmed.  If you use this clause, the user cannot switch or eject volumes from the interface and has only one option:  to quit.
  1943. Easy Install Rule Clauses
  1944. AddPackages
  1945. AddPackages{ { assertionValueList } }
  1946. packageIDList     A list of 2-byte package resource (‘inpk’) IDs.
  1947. DESCRIPTION
  1948. The AddPackages clause is used to return a set of packages to the Easy Install screen.  AddPackages can be called multiple times from a script, and the packages are unioned together.  AddPackages takes a list of package IDs as arguments.  addPackages always returns TRUE.
  1949. AddUserDescription
  1950. AddUserDescription{ messageString }
  1951. messageString     String to display.  (Pascal String)
  1952. DESCRIPTION
  1953. Use AddUserDescription to add to the text which is shown in the Easy Install dialog.  AddUserDescription takes a single even-padded Pascal string as an argument.  The text to be added is appended to whatever text has been previously added using the AddUserDescription clause.  Up to four lines can be displayed.  AddUserDescription always returns TRUE.  Note that the Installer will not supply introductory information so you need to say something like: “Click the Install button to install\n{your product here}.”  Use the "\n" characters to insert a return character into the description string.
  1954. Custom Install Rule Clauses
  1955. AddCustomItems
  1956. AddCustomItems{ { integer packageRsrcID } }
  1957. packageRsrcID     A list of 2-byte resource IDs of ‘inpk’ resources to append to the top level of the Custom Install list.
  1958. DESCRIPTION
  1959. The AddCustomItems rule clause appends the specified packages to the top level of the custom install list regardless of the setting of its showsOnCustom flag.  Each package is appended in the order listed.  All sub-packages with the showsOnCustom flag set are appended at the appropriate sub-level.
  1960.  
  1961. File Specification
  1962. This chapter describes how to create the script resources that specify the source and target file.
  1963. About File Specifications
  1964. Most atoms require a source and target file to be specified in order to carry out the action defined by the atom.  For example, when using a File Atom to copy a file from the source disk to the target disk, a Target File Spec resource (‘intf’) and a Source File Spec resource (‘infs’) must be referenced from the atom.
  1965. NOTE
  1966. When performing installations from some network servers, it is necessary that all source files have a file creation and modification time stamp that has an even value for the seconds.  If you intend for installation to be performed from network servers you should set the creation and modification times of all your source files to a value such as 12:00:00 PM. u
  1967. Specifying Target Files (‘intf’)
  1968. The goal of the Target File Spec is to specify where to install the file on the target disk.  In most cases the scriptwriter can hard code the path to the target file using the various reserved folder path names, or in special cases, search for the file using a code resource.
  1969. The path to the target file that must start with a colon or one of two reserved tokens (special-xxxx or folder-user).  Because the target volume name is not known at the time a script is written, the scriptwriter supplies a partial path name that begins in the root directory of the target disk. 
  1970. Installing into Special Folders
  1971. A scheme is provided to support special folders such as the System Folder, the Apple Menu Folder, and other Folder Manager folders.  The short-hand notation used to specify a folder manager folder is “special-xxxx”, where the “xxxx” is one of the defined special folder types. The special folder types currently defined for System 7.0 through 7.1 are as follows:
  1972. Type        Folder
  1973. 'macs'    Blessed System Folder
  1974. 'prnt'    PrintMonitor Documents Folder
  1975. 'strt'    Startup Folder
  1976. 'amnu'    Apple Menu Items Folder
  1977. 'extn'    Extensions Folder
  1978. 'pref'    Preferences Folder
  1979. 'ctrl'    Control Panels Folder
  1980. 'font'    Fonts Folder (applies to System 7.1 only)
  1981. This means that if the fully qualified path to the system file on the target disk was “MyVolume:MyFolder:MySystemFolder:System”, then a reference to the special folder “special-macs” would be expanded by the installer to be “MyVolume:MyFolder:MySystemFolder.”  For example, if you wanted to install the Finder file into the blessed folder on the system disk, you would use the path name “special-macs:Finder” in the File Spec.  If a folder in the path name does not exist, the Installer creates it.  The Installer supports the use of special folders even when running on systems which do not have Folder Manager functionality.  For more information about the Folder Manager, refer to the Finder chapter in Inside Macintosh, Volume VI.  
  1982. To support installing into pre-7.0 systems, the Installer will automatically map special folders to the System Folder.  For example, if your target is the Extensions Folder then the Installer will change the destination to the System Folder rather than create an Extensions Folder.  This also applies to rule clauses that reference a file spec.  While this simplifies script writing for many files that go into special folders, it does not simplify DA installation.
  1983. Localized systems are supported through a defined algorithm for determining the correct special folder name by searching for the proper ‘fld#’ resource.  Given a special folder type, the Installer searches for the type in a ‘fld#’ resource in the following order:
  1984. n    Installer script file
  1985. n    Target System file
  1986. n    Installer application file
  1987. n    Booted System file
  1988. Generally, the scriptwriter should not include a ‘fld#’ resource in the script so installations into localized System Folders will happen correctly.
  1989. Installing into the User-Selected Application Folder
  1990. The scriptwriter can easily install or remove files and resources from the application folder selected by the user.  This reserved folder name should only be used in conjunction with the application folder interface mode.  For example, to install the file “Demo Application” into the application folder the path name might be “folder-user:Demo Application”.
  1991. Managing Rollbacks on Multiple Target Volumes
  1992. With the ability to install onto more than one target volume at a time, a complete rollback is not possible unless the original files on all target volumes are maintained.  This is not always possible due to available disk space on the target volumes.  The Installer always saves the original System Folder files on the boot volume, but makes the saving of all other original files optional based on the amount of available disk space on each target volume.  If there is enough space to save all original files on all target volumes the ‘Cancel’ button shows in the Status dialog thereby allow for a complete rollback, otherwise a ‘Stop’ button is shown.
  1993. Installing onto the Installer Volume
  1994. To support installation onto the Installer volume, the Installer must prevent source files from being disturbed.  After the user clicks the Install button, the Installer determines whether any target file matches the location of a source file.  If there is a conflict the user is alerted.  This case is much more likely to happen when the scriptwriter allows the user to select the target application folder.
  1995. Setting the Finder flags and Dates
  1996. Format 1 of the ‘intf’ resource supports supplying the Finder flags, creation date and modification date to make target file specification of archived files easier.  The Installer sets the values of a newly created file to the specified values  in the ‘intf’.  If the ‘intf’ is referenced from a File or ResMerge Atom and the file already exists the Finder flags, creation and modification dates will be updated.  The Finder Flags in a File Atom will always override the Finder Flags specified in the ‘intf’ resource.
  1997. If you use an ‘infs’ or format 0 of the ‘intf’ the Installer continues to use the Finder flags, creation and modification date of the source file.  In cases where the source file is a compressed archive, format1 version of the ‘intf’ is recommended.  ScriptCheck will fill in the correct flags and dates if the file does not reference an Atom Extender.  If an Atom Extender is being used, make sure to supply the appropriate ScriptCheck extension.  To have ScriptCheck fill in the correct values, place a zero in the Finder flags field and 1 in the Creation Date and Modification Date fields.  If the date field is zero or 1, the Installer reverts to the older method of determining the correct target date, such as with format 0 of the ‘intf’.
  1998. Specifying Source Files (‘infs’)
  1999. The goal of the Source File Spec is to describe where the file resides on the original distribution source disk.
  2000. Source Disk Search Path
  2001. Because of multiple disk installation capability, the semantics of the File Name field are a bit complex.  Customers may have copied the distribution disks onto a file server and want to install from there, or they may have made floppy backup copies of the system disks provided by Apple and expect to be able to install from those.  They might also want to set up a server that users can install from.  In either case, the path name specified in the File Name field of the Source File Spec will probably be slightly off (e.g. the backup disks may not have the same names as the originals) so we need to be somewhat flexible when searching for a specific source file.  In a Source File Spec, the full path name (including volume name) must be given in the File Name field, but it may not be used by the Installer exactly as given.
  2002. While the Installer is flexible as to exact volume names, it requires that disk contents be the same as what is specified in the script.  The Installer uses the scripts to make a list of the volumes that are needed for the installation, and the files that should be on each volume.  All files that are supposed to be on the same volume must be on the same volume, but that volume’s name may be different from the name given in the script.  In addition, we relax this condition slightly to allow for hard disk and network installations.  When the Installer needs a disk specified in the script, it searches in the following order:
  2003. n    Search for a folder with the disk’s name at the same HFS level as the script.
  2004. n    Search for a folder with the disk’s name at the script parent’s HFS level.
  2005. n    Search for a folder with the disk’s name at the same HFS level as the Installer.
  2006. n    Search for a folder with the disk’s name at the Installer parent’s HFS level
  2007. n    Search for an online volume with the correct name.
  2008. n    If the Installer was not launched from an AppleShare server volume, ask for a floppy disk or CD-ROM.
  2009. For backup purposes, the Installer makes the assumption that source diskettes may have the disk name changed.  For example, the user may omit such special characters such as '©' and '™' when making the backup copies of the original installations disk.  To find source files, the Installer parses off the disk name and searches for the required files from the root level of the current diskette.  If the file is not found, the search criteria listed above are used.
  2010. The disk that the Installer is on is a special case in our requesting disk and disk content strategies.  If possible, the Installer’s disk is always the first disk that we copy files and resources from.  Also, the contents of the Installer disk are checked for correctness before anything is deleted or copied. We recommend that scriptwriters (especially for system releases) have the most important files and resources to be copied on the Installer disk, since that’s the only disk that we can guarantee the user has.  Otherwise, the Installer could start the installation, which includes deleting all appropriate target files and resources, and have to ask for a disk that contains a crucial file, in which case the user cancels out of the dialog, since that disk is for some reason not available, thereby aborting the installation, leaving the user worse off than before (i.e., a system that no longer boots).  This, of course, does not happen when doing a live install
  2011. File spec. IDs of 0 should only be used for source files specifications for the deletion of files;  when the noCopy and deleteOnInstall flags are set in the 'infs' resource
  2012. File Spec. Reference
  2013. This section describes the data structures and script resources needed to reference source and target files from atoms.
  2014. Resource Descriptions
  2015. The section describes the resource definitions for the target file specification resource (‘intf’) and the source file specification resource (‘infs’).
  2016. Target File Spec. Resource (‘intf’)
  2017. The new Target File Spec. resource contains a reference to an ‘insp’ script resource which describes the file searching code resource, much like the Atom Extender script resource does. 
  2018. #define    targetFileFlags                                            \
  2019.         boolean        noSearchForFile, SearchForFile;            \
  2020.         boolean        TypeCrNeedNotMatch, TypeCrMustMatch;    \
  2021.         fill bit[14]                        /* Reserved    */
  2022. type    'intf' {
  2023.     switch {
  2024.         case format0:
  2025.             key integer = 0;            /* Target File Spec. Format version */
  2026.             fileSpecFlags;                /* Target File Spec. Flags */
  2027.             literal longint;            /* Target File Type */
  2028.             literal longint;            /* Target File Creator */
  2029.             literal integer;            /* Search Proc. Rsrc ID */ 
  2030.             evenPaddedString;            /* Target File Path */
  2031.         case format1:
  2032.             key integer = 1;            /* Target File Spec. Format version */
  2033.             fileSpecFlags;                /* Target File Spec. Flags */
  2034.             OSType;                        /* Target File Type */
  2035.             OSType;                        /* Target File Creator */
  2036.             unsigned hex integer;    /* Target File Finder Flags */
  2037.             unsigned hex longint;    /* Target File Creation Date */
  2038.             unsigned hex longint;    /* Target File Mod. Date */
  2039.             rsrcID;                        /* Search Proc. Rsrc ID */ 
  2040.             evenPaddedString;            /* Target File Path */
  2041.     };
  2042. };
  2043. Flag descriptions 
  2044. noSearchForFile/SearchForFile
  2045. Determines if the Search Procedure code resource will be called.  Use the searchForFile flag to override the specified file path and use the list of files returned from the Search Procedure code resource.
  2046. TypeCrNeedNotMatch/TypeCrMustMatch
  2047. Determines if the specified type and creator must match the file found on the target disk.  If the type and creator of the found file do not match those specified, the installation stops the installation.  This is also true of any found files returned by the Search Procedure.
  2048. Field descriptions 
  2049. Target File Type     The file’s type if the Installer must create one during a copy.  If the TypeCrMustMatch flag is used and an existing file is found, its type must match the type entered in this field.  (4-bytes)
  2050. Target File Creator     The file’s creator if the Installer must create one during a copy.  If the TypeCrMustMatch flag is used and an existing file is found, its creator must match the creator entered in this field.  (4-bytes)
  2051. Target Finder Flags     The Finder flags to be given to a new file.  If referenced from a ResMerge Atom, the Finder Flags are given to the existing file.  The Finder flags specified in a File Atom always override this field.  Only available in format 1.  (2-bytes)
  2052. Target Creation Date     The creation date to be given to a new file.  If referenced from a  File Atom or ResMerge Atom, the existing file is given this creation date.  Leave as 0 to use the source file’s or today’s date.  Set to 1 to have ScriptCheck update using the source file’s creation date.  Only available in format 1.   (4-bytes)
  2053. Target Mod. Date     The modification date to be given to a new file.  If referenced from a  File Atom or ResMerge Atom, the existing file is given this modification date.  Leave as 0 to use the source file’s or today’s date.  Set to 1 to have ScriptCheck update using the source file’s modification  date.  Only available in format 1.  (4-bytes)
  2054. Search Procedure Rsrc ID 
  2055. The resource ID of an ‘insp’ resource, which describes the code resource to call to perform the target file search.  (2-bytes)
  2056. Target File Path     The partial path to the target file that must start with a colon or one of two reserved tokens (special-xxxx or folder-user).  (even-padded Pascal string)
  2057. Source File Spec Resource (‘infs’)
  2058. The ‘infs’ script resource is referenced from atoms.
  2059. #define    fileSpecFlags                                                    \
  2060.         boolean        noSearchForFile, searchForFile;                \
  2061.         boolean        typeCrNeedNotMatch, typeCrMustMatch;        \
  2062.         fill bit[14]
  2063. type    'infs' {                                                        
  2064.         literal longint;                                    /* File Type    */
  2065.         literal longint;                                    /* File Creator    */
  2066.         unsigned hex longint;                            /* Creation Date*/ 
  2067.         fileSpecFlags;                                        /* File Spec Flags */
  2068.         evenPaddedString;                                    /* Full Path */
  2069. };
  2070. Flags descriptions 
  2071. noSearchForFile/searchForFile 
  2072. Ignored in Installer 4.0.
  2073. typeCrNeedNotMatch/typeCrMustMatch 
  2074. Determines if the type and creator contained in the File Creator and File Type fields must exactly match the source file on the source disk.  Use the typeCrMustMatch flag to force the type and creator to match, otherwise the installation stops with an error.
  2075. Field descriptions 
  2076. Source File Type     The source file’s type.  If the TypeCrMustMatch flag is used the source file’s type must match the type entered in this field.  Otherwise, the user is told the source disk is bad and the installation is canceled.  (4-bytes)
  2077. Source File Creator     The source file’s creator.  If the TypeCrMustMatch flag is used source file’s creator must match the creator entered in this field.  Otherwise, the user is told the source disk is bad and the installation is canceled. (4-bytes)
  2078. Creation Date     The creation date the source file must have, otherwise the installation is stopped.  Values of 0 or 1 are considered to match any creation date.  (4-bytes)
  2079. Source File Path     The full path to the source file.  (even-padded Pascal string)
  2080. About File Searching (‘insp’)
  2081. Whenever you want to update or delete a file on the user’s disk but don’t know where the file will reside, you’ll need to search for it at installation time.  For those File and Resource atoms you wish to search for the target file, attach a Search Procedure (‘insp’) script resource to the new Target File Spec. (‘intf’) script resource, then reference the ‘intf’ resource from the atom just as you would the older ‘infs’ script resource.  Setting the searchForFile flag in the ‘intf’ resource will tell the Installer to call the code resource at the appropriate time.  The built-in searching feature of the Installer will be removed and the searchForFile flag in the present ‘infs’ resource will be ignored. 
  2082. The actual searching code will be supplied by you, the scriptwriter, in a code resource whose type and ID is specified in the ‘insp’ resource.
  2083. Using File Searching with File and Resource Atoms
  2084. The file searching code resource is given a pointer to a parameter block containing useful information about the Installer’s environment.  The search routine performs a search for the desired file(s), then passes back a list of those files it has found, including a result code to tell the Installer whether to continue or stop.
  2085. The search routine’s task is to create and return a handle to an array of FoundFileRec records in the parameter block’s fFoundFiles field.  The array should contain zero or more FoundFileRec records that specify each target file to act upon.  The number of elements in the array is determined by the size of the handle.  If the array has no elements, then the atom is ignored.  If one FoundFileRec element is specified, then the atom (file, resource, or font atom ) is processed normally with the designated target file.  If more than one FoundFileRec element is in the array, the atom is duplicated for each element. 
  2086. The files that are returned to the Installer may or may not already exist.  The Installer will verify that the volume and directory exist and are valid, and that the file name does not conflict with an existing directory name.  If the file does not exist the Installer will create one, if necessary.
  2087. Using File Searching with Rule Clauses
  2088. File searching can also be used with Target File Specs that are referenced from rule clauses.  If a Target File Spec returns more than one found file, the rule clause is duplicated for each valid file.  The duplicated rule clauses are “anded” with the original rule clause.  Therefore, in order for the original rule clause to return TRUE, every duplicated rule clause must also return TRUE.
  2089. Allowable Installer Functions During File Searching
  2090. While your file searching code resource is executing, you can call selected Installer functions.
  2091. Allowable Installer functions:
  2092. n    Memory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  2093. n    Action Handler functions:  RegisterAction.
  2094. File Searching Reference
  2095. This section describes the data structures and new script resources needed to support target file searching.
  2096. Data Structures
  2097. This section describes the function interface and parameter block passed to the Search Procedure code resource.
  2098. The Search Procedure must return a handle to an array of records describing the files it found.  This array handle is defined as:
  2099. typedef struct {
  2100.    short     vRefNum;
  2101.    long         parID;
  2102.    Str63     name;
  2103.     short        fReferenceID;        /* Reserved for internal use. */
  2104. } FoundFileRec, FoundFileArray[], *FoundFileArrayPtr[], **FoundFileHdl[];
  2105. The handle should be allocated using the Installer’s INewHandle routine.
  2106. Function Interface
  2107. This section describes the Search Procedure function interface and the required result values.
  2108. The file search function must return one of three results to tell the Installer how to proceed:
  2109. typedef enum { kFatalSearchError                 = -1,
  2110.                     kSearchSuccessful                 = 0,
  2111.                     kCancelSearchAndInstallation    = 1
  2112.                 } SearchResult;
  2113. The file search function must have the following interface:
  2114. SearchResult    FileSearchRoutine( SearchProcedurePBPtr);
  2115. Parameter Block
  2116. The file search code resource is passed a pointer to a parameter block containing useful information.  Your code resource will want to return a handle to a list of found files in the fFoundFileArray field.
  2117. typedef  struct {
  2118. —>    ProcPtr                fCallBackProcPtr;
  2119. —>    short                    fTargetVRefNum;
  2120. —>    long                    fTargetFolderDirID;
  2121. —>    short                    fSystemVRefNum;
  2122. —>    long                    fSystemBlessedDirID;
  2123. —>    long                    fRefCon;
  2124. —>    OSType                fFileSpecType;
  2125. —>    OSType                fFileSpecCreator;
  2126. —>    long                    fFileSpecCrDate;
  2127. —>    Str255;                fFileSpecPath;
  2128. <-    FoundFileArrayHdl    fFoundFilesArray;
  2129. } SearchProcedurePBRec, *SearchProcedurePBPtr;
  2130. Field descriptions 
  2131. fCallBackProcPtr    A pointer to the Installer’s dispatch routine.  You’ll need to pass this field as a parameter to glue routines that provide access to Installer functions.
  2132. fTargetVRefNum    The target disk’s vRefNum.  When allowing the user to select a target application folder, this is the volume on which the folder resides.
  2133. fTargetFolderDirID    The target application folder’s directory ID.  This value is -1 if the user cannot select a target application folder.  Target File Specs that use the reserved folder path folder-user will be placed in this folder.
  2134. fSystemVRefNum    The system disk’s vRefNum.  Target File Specs that use the reserved folder path special-xxx will be placed in the System Folder on this volume.
  2135. fSystemBlessedDirID    The directory ID of the System Folder on the disk with the refNum fSystemVRefNum.  This directory is not necessarily the currently active System Folder.
  2136. fRefCon    A 4-byte value defined by the scriptwriter in the ‘insp’ script resource.
  2137. fFileSpecType    The value from the Target File Type field of the Target File Spec.
  2138. fFileSpecCreator    The value from the Target File Creator field of the Target File Spec.
  2139. fFileSpecCrDate    The value from the Target File Creation Date field of the Target File Spec.
  2140. fFileSpecPath    The value from the Target File Path field of the Target File Spec.
  2141. fFoundFilesArray    A handle to an array of found target files that is created and filled by the code resource.
  2142. Resource Description
  2143. The ‘insp’ script resource is referenced from the new Target File Spec.  It defines how to call the code resource that will perform the actual search.
  2144. type    'insp' {    
  2145.     switch {
  2146.         case format0:
  2147.             key integer = 0;    /* Search Procedure Format version */
  2148.             unsigned integer;    /* Search Procedure Flags */
  2149.             literal longint;    /* Search Procedure Code Rsrc Type */
  2150.             literal integer;    /* Search Procedure Code Rsrc ID */
  2151.             literal longint;    /* RefCon Value */
  2152.             literal longint;    /* Required Free Memory */
  2153.             evenPaddedString;    /* Search Procedure Summary */
  2154. };
  2155. };
  2156. Field descriptions 
  2157. Search Procedure Flags     Currently reserved for use by Apple Computer, Inc.  (2-bytes)
  2158. Search Procedure Code Rsrc Type 
  2159. The type of the code resource that will be called to perform the search.  (4-bytes)
  2160. Search Procedure Code Rsrc ID 
  2161. The ID of the code resource that will be called to perform the search.  (2-bytes)
  2162. RefCon Value    The value that will be passed to the code resource in the fRefCon field of the Search Procedure parameter block.  (4-bytes) 
  2163. Required Free Memory    The minimum number of free bytes the Search Procedure code resource needs in its own heap to make local allocation of memory using Macintosh OS/Toolbox routines.  Enter 0 (zero) to not create a sub-heap and run inside the Installer’s heap.  Please  see warnings about using sub-heaps in the Atom Extender section if you specify a value other than 0.  (4-bytes) 
  2164. Search Procedure Summary
  2165. An optional string briefly describing the purpose of this Search Procedure.  This string is never displayed to the user.  (even-padded Pascal string) 
  2166. About the Disk Order Resource (‘indo’)
  2167. By default, the Installer requests disks from the user using the order of the atoms specified in the script.  This ordering is displayed in the status dialog.  With more than just a few atoms, it can be very difficult to control the order of disks.  To make this easier, if an Installer Disk Order resource exists in the script (resource type 'indo'), this resource is used to determine the ordering of the disks.  The format of the 'indo' resource is given below.  The resource contains a list of Pascal strings that are the names of the source disks.  These names must exactly match the names of the volumes given in the source and target paths within the File Specs. 
  2168. For example, let’s say you have created a two disk set that uses one floppy disk and one CD volume.  Your ‘indo’ might look like this:
  2169. resource 'indo' (1000) {
  2170.     format1 {{
  2171.         kExpectFloppyDisk,
  2172.         "Installer Disk",
  2173.         kExpectCDVolume,
  2174.         "Applications CD"
  2175.     }};
  2176. };
  2177. Specifying the expected type of source disk just helps the Installer know which type of disk drive to make available to insert the requested source disk.  This feature does not affect the user’s ability to create network installation folders on an AppleShare server volume.
  2178. Disk Order Reference
  2179. Resource Description
  2180. Format 0 of the new ‘indo’ resource:
  2181. #define SrcDiskType                                                        \
  2182.         integer                                                                \
  2183.         kExpectFloppyDisk     = 0,    /* It’s a floppy Disk */    \
  2184.         kExpectCDVolume         = 1,    /* It’s a CD */                \
  2185.         kExpectFoldersOnVol     = 2    /* It’s a folder */    
  2186. type 'indo' {
  2187.     switch {
  2188.         case format1:
  2189.             key integer = 1;
  2190.             integer = $$Countof(SrcVolArray);
  2191.             array SrcVolArray {
  2192.                     SrcDiskType;            /* Source Disk Type */
  2193.                     evenPaddedString;        /* Source Disk Name */
  2194.             };
  2195.     };
  2196. };
  2197. Field descriptions
  2198. Source Disk Type     The expected source disk type.  Currently, a floppy disk; CD or folders on a CD, HD, or AppleShare volume.  The Installer primarily uses this information to determine which type of disk to eject to make room for the requested source disk.  For example, if the requested source disk is expected to be a CD and all CD drives are full, then one of the CDs will be ejected.  (2-bytes) 
  2199. Source Disk Name     The name of the source disk.  The name can end in a colon if you wish.  (2-bytes)
  2200.  
  2201. Installer Functions
  2202. This chapter describes the routines that are available when running as an external code resource within the Installer environment.
  2203. About Installer Functions
  2204. Installer functions allow the code resource writer to communicate with the Installer and use utility routines provided by the Installer.  Some of the routines are the essential mechanism for communicating with the Installer, such as when decompressing files during installation.  These routines are often limited to being called from specific code resources.  Other routines may be available all the time, either as a means to getting information from the Installer or as helpful utility routines.
  2205. All Installer callback functions are actually glue routines that you must include in your code to access the proper routines inside the Installer.  In the discussion of each routine the name of the header file and glue file is mentioned.
  2206. Data I/O Routines
  2207. This section describes the routines available to manage reading and writing atom data.  Most of these routines are only available in Atom Extenders.  These routines function very similar to high-level File Manager routines.  Consult Inside Macintosh:  File s for an overview of topics such as positioning marks in files.
  2208. ReadSourceData
  2209. OSErr ReadSourceData(     CallBackProcPtr    pCallBackProcPtr, 
  2210.                                 long*                 count,
  2211.                                 Ptr                    bufferPtr );
  2212. pCallBackProcPtr    The callback pointer.
  2213. count    The number of bytes to read from the source data.  After the call, the actual number of bytes read is returned in count.
  2214. bufferPtr     A pointer to a buffer of at least size count.
  2215. DESCRIPTION
  2216. The ReadSourceData function reads the specified number of bytes from the source data beginning at the current position.  The supplied pointer must have already been allocated to at least the size of count.
  2217. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2218. RESULT CODES    
  2219. kNotImplementedErr    30901    Routine not currently implemented
  2220. noErr    0    No error
  2221. ioErr    -36    I/O Error
  2222. eofErr    -39    End of part reached
  2223. paramErr    -50    Negative count or NULL bufferPtr
  2224. WriteTargetData
  2225. OSErr WriteTargetData(     CallBackProcPtr    pCallBackProcPtr,
  2226.                                 long                     count,
  2227.                                 Ptr                     bufferPtr );
  2228. pCallBackProcPtr    The callback pointer.
  2229. count    The number of bytes to write to the target at the current position.
  2230. bufferPtr     A pointer to a buffer of at least size count.
  2231. DESCRIPTION
  2232. The WriteTargetData function writes the specified number of bytes from the supplied buffer to the target beginning at the current position.  The data is not immediately written to the target file, but rather is buffered using the Installer heap or MultiFinder temporary memory.  This reduces our need for the target disk, which is especially important when installing onto floppy disks.
  2233. IMPORTANT
  2234. Since there is overhead associated with each call to WriteTargetData, calls to write very small amounts of data (less than 1K) should be avoided. 
  2235. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2236. RESULT CODES
  2237. kNotImplementedErr    30901    Routine not currently implemented
  2238. noErr    0    No error
  2239. paramErr    -50    Negative count or NULL bufferPtr 
  2240. memFullErr    -108    Not enough memory to buffer data
  2241. ReadTargetData
  2242. OSErr ReadTargetData(     CallBackProcPtr    pCallBackProcPtr, 
  2243.                                 long*                 count,
  2244.                                 Ptr                     bufferPtr );
  2245. pCallBackProcPtr    The callback pointer.
  2246. count    The number of bytes to read from the target data.  After the call, the actual number of bytes read is returned in count.
  2247. bufferPtr     A pointer to a buffer of at least size count.
  2248. DESCRIPTION
  2249. The ReadTargetData function reads the specified number of bytes from the target data beginning at the current position.  The supplied pointer must have already been allocated to at least the size of count.
  2250. IMPORTANT
  2251. The ReadTargetData function can only be called while in a Version Compare code resource that was referenced from a Resource Atom.  Calling this function at any other time will return a kNotImplementedErr error.
  2252. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2253. RESULT CODES    
  2254. kNotImplementedErr    30901    Routine not currently implemented
  2255. noErr    0    No error
  2256. ioErr    -36    I/O Error
  2257. eofErr    -39    End of part reached
  2258. paramErr    -50    Negative count or NULL bufferPtr 
  2259. SetTargetDataPos
  2260. OSErr SetTargetDataPos(    CallBackProcPtr    pCallBackProcPtr,
  2261.                                 short                 positionMode,
  2262.                                 long                     positionOffset );
  2263. pCallBackProcPtr    The callback pointer.
  2264. positionMode    The positioning mode.
  2265. positionOffset     The positioning offset.
  2266. DESCRIPTION
  2267. The SetTargetDataPos function sets the current position in the target data. 
  2268. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2269. RESULT CODES
  2270. kNotImplementedErr    30901    Routine not currently implemented
  2271. noErr    0    No error
  2272. eofErr    -50    End of target data reached
  2273. posErr    -40    Attempt to position mark before start of target data
  2274. GetTargetDataPos
  2275. OSErr GetTargetDataPos(    CallBackProcPtr    pCallBackProcPtr, 
  2276.                                 long*                    positionOffset );
  2277. pCallBackProcPtr    The callback pointer.
  2278. positionOffset     On output, contains the current position offset from the beginning of the target data.
  2279. DESCRIPTION
  2280. The GetTargetDataPos function returns the current position from the beginning of the target data. 
  2281. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2282. RESULT CODES
  2283. kNotImplementedErr    30901    Routine not currently implemented
  2284. noErr    0    No error
  2285. GetTargetDataEOF
  2286. OSErr GetTargetDataEOF(    CallBackProcPtr    pCallBackProcPtr, 
  2287.                                 long*                    theLength );
  2288. pCallBackProcPtr    The callback pointer.
  2289. theLength     On output, contains the current length of the target data.
  2290. DESCRIPTION
  2291. The GetTargetDataPos function returns the current length of the target data.
  2292. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2293. RESULT CODES
  2294. kNotImplementedErr    30901    Routine not currently implemented
  2295. noErr    0    No error
  2296. SetSourceDataPos
  2297. OSErr SetSourceDataPos(    CallBackProcPtr    pCallBackProcPtr, 
  2298.                                 short                 positionMode,
  2299.                                 long                     positionOffset );
  2300. pCallBackProcPtr    The callback pointer.
  2301. positionMode    The positioning mode.
  2302. positionOffset     The positioning offset.
  2303. DESCRIPTION
  2304. The SetSourceDataPos function sets the current position in the source data. 
  2305. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2306. RESULT CODES
  2307. kNotImplementedErr    30901    Routine not currently implemented
  2308. noErr    0    No error
  2309. eofErr    -50    End of source part data reached
  2310. posErr    -40    Attempt to position mark before start of source part data
  2311. GetSourceDataPos
  2312. OSErr GetSourceDataPos(    CallBackProcPtr    pCallBackProcPtr,
  2313.                                 long*                 positionOffset );
  2314. pCallBackProcPtr    The callback pointer.
  2315. positionOffset     On output, contains the current position from the beginning of the source data.
  2316. DESCRIPTION
  2317. The GetSourceDataPos function returns the current position from the beginning of the source data. 
  2318. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2319. RESULT CODES
  2320. kNotImplementedErr    30901    Routine not currently implemented
  2321. noErr    0    No error
  2322. GetSourceDataEOF
  2323. OSErr GetSourceDataEOF(    CallBackProcPtr    pCallBackProcPtr, 
  2324.                                 long*                    theLength );
  2325. pCallBackProcPtr    The callback pointer.
  2326. theLength     On output, contains the length of the source data.
  2327. DESCRIPTION
  2328. The GetSourceDataPos function returns the length of the source data. 
  2329. See interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  2330. RESULT CODES
  2331. kNotImplementedErr    30901    Routine not currently implemented
  2332. noErr    0    No error
  2333. Memory Routines
  2334. This section describes the routines available to manage static memory.  Some code resources can pass back a handle to static memory so the code resource can communicate between invocations of the code resource.  Generally, these routines are available all the time.
  2335. INewHandle
  2336. Handle INewHandle(     CallBackProcPtr    pCallBackProcPtr, 
  2337.                             long                    newHandleSize );
  2338. pCallBackProcPtr    The callback pointer.
  2339. newHandleSize     The requested size to allocate the handle.
  2340. DESCRIPTION
  2341. The INewHandle function attempts to allocate a handle of the specified size.  If the memory is not immediately available, the Installer writes out any buffered target data to the appropriate target disk, then tries again.  The resulting handle is NULL if the handle could not be allocated.
  2342. Use INewHandle when you want to pass information between invocations of an Atom Extender using the fStaticDataHandle of the parameter block.
  2343. See interface file “InstallerMemoryFuncsHeader.h” and glue code file “InstallerMemoryCBGlue.c”.
  2344. IMPORTANT
  2345. Always use IDisposHandle to release a handle allocated using INewHandle.  Always use IHLock and IHUnLock when locking and unlocking a handle allocated using INewHandle.
  2346. RESULT CODES
  2347. kNotImplementedErr    30901    Routine not currently implemented
  2348. noErr    0    No error
  2349. memFullErr    -108    Not enough room in the Installer’s or MultiFinder’s heap zone
  2350. IDisposHandle
  2351. Handle IDisposHandle(     CallBackProcPtr    pCallBackProcPtr,
  2352.                                 Handle                 storageHandle );
  2353. pCallBackProcPtr    The callback pointer.
  2354. storageHandle     The handle to be disposed.
  2355. DESCRIPTION
  2356. The IDisposHandle function disposes the handle in the parameter storageHandle.  The handle could have been allocated using the Installer’s INewHandle function, or with any other Macintosh Toolbox routine.
  2357. See interface file “InstallerMemoryFuncsHeader.h” and glue code file “InstallerMemoryCBGlue.c”.
  2358. RESULT CODES
  2359. kNotImplementedErr    30901    Routine not currently implemented
  2360. noErr    0    No error
  2361. nilHandleErr    -109    NULL master pointer
  2362. memWZErr    -111    Attempt to operate on a free block
  2363. IHLock
  2364. void    IHLock( CallBackProcPtr    pCallBackProcPtr, 
  2365.                     Handle     storageHandle );
  2366. pCallBackProcPtr    The callback pointer.
  2367. storageHandle     The handle to lock.
  2368. DESCRIPTION
  2369. The IHLock function locks the specified handle.
  2370. See interface file “InstallerMemoryFuncsHeader.h” and glue code file “InstallerMemoryCBGlue.c”.
  2371. IMPORTANT
  2372. Always use IHLock to lock a handle allocated using INewHandle.
  2373. RESULT CODES
  2374. kNotImplementedErr    30901    Routine not currently implemented
  2375. noErr    0    No error
  2376. nilHandleErr    -109    NULL master pointer
  2377. memWZErr    -111    Attempt to operate on a free block
  2378. IHUnLock
  2379. void    IHUnLock(     CallBackProcPtr    pCallBackProcPtr, 
  2380.                         Handle                 storageHandle );
  2381. pCallBackProcPtr    The callback pointer.
  2382. storageHandle     The handle to lock.
  2383. DESCRIPTION
  2384. The IHUnLock function unlocks the specified handle.
  2385. See interface file “InstallerMemoryFuncsHeader.h” and glue code file “InstallerMemoryCBGlue.c”.
  2386. IMPORTANT
  2387. Always use IHUnLock to unlock a handle allocated using INewHandle.
  2388. RESULT CODES
  2389. kNotImplementedErr    30901    Routine not currently implemented
  2390. noErr    0    No error
  2391. nilHandleErr    -109    NULL master pointer
  2392. memWZErr    -111    Attempt to operate on a free block
  2393. Misc. Routines
  2394. This section describes various miscellaneous routines available.
  2395. RegisterScriptAction
  2396. void RegisterScriptAction( CallBackProcPtr    pCallBackProcPtr,
  2397.                                     short                    actionClassID,
  2398.                                     short                    actionIdentifier,
  2399.                                     void*                    param0,
  2400.                                     void*                    param1,
  2401.                                     void*                    param2,
  2402.                                     void*                    param3,
  2403.                                     void*                    resultPtr )
  2404. pCallBackProcPtr    The callback pointer.
  2405. actionClassID    The action class ID number.
  2406. actionIdentifier    The action identifier number.
  2407. param0…param3    A pointer to data or 4-byte value used to send information to the Action Handler about the action.
  2408. resultPtr    A pointer to a variable that the Action Handler can send information back to the caller.  The format of the data structure is defined individually for those actions that allow modification to the result.
  2409. DESCRIPTION
  2410. The RegisterScriptAction function registers an action with the Installer, which will be immediately given to all loaded Action Handlers.  This function is made available to help code resource writers easily send text messages to the Installer Debugger, using the action class kDebuggingAction, and the action identifier kGenericDebugActID.
  2411. See interface file “ActionHandlerHeader.h” and glue code file “ActionHanderCBGlue.c”.
  2412. IMPORTANT
  2413. RegisterScriptAction cannot be called from within an ActionHandler code resource.
  2414. SuspendWaitCursor
  2415. void SuspendWaitCursor( CallBackProcPtr    pCallBackProcPtr )
  2416. pCallBackProcPtr    The callback pointer.
  2417. DESCRIPTION
  2418. Calling the SuspendWaitCursor function stops the wait cursor and returns the cursor to an arrow.  Use the ResumeWaitCursor to begin the wait cursor again.  This is handy if you want to show a dialog from a code resource during the installation.
  2419. See interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.
  2420. ResumeWaitCursor
  2421. void ResumeWaitCursor( CallBackProcPtr    pCallBackProcPtr )
  2422. pCallBackProcPtr    The callback pointer.
  2423. DESCRIPTION
  2424. Calling the ResumeWaitCursor function sets the cursor to the wait cursor.
  2425. See interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.
  2426. IncrementStatusBar
  2427. void IncrementStatusBar(     CallBackProcPtr    pCallBackProcPtr,
  2428.                                     short                    pIncrementAmount )
  2429. pCallBackProcPtr    The callback pointer.
  2430. pIncrementAmount    Number of increments.
  2431. DESCRIPTION
  2432. Calling the IncrementStatusBar function increments the status bar during long waits inside your code resource.  Most often you’ll use this in your Action Atom code resource.  Upon entry to your Action Atom you are given 100 status increments to use to show progress while executing a single Action Atom.  The Installer limits the bar so you don’t have to worry about incrementing the bar too far. 
  2433. See interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.
  2434.  
  2435. Miscellaneous Features
  2436. This chapter describes miscellaneous features of Installer 4.0 available to scriptwriters.
  2437. About Action Handlers
  2438. Action Handlers allow external code resources to be called in response to specific actions in a “debug” version of the Installer.  An action might provide information about which files will be replaced during the installation, the reason the script cannot be read, the outcome of Easy Install or Custom Install rule evaluation, or why the installation failed.  
  2439. The Action Handler code resource should be located in the script file.  A “debug” version of the Installer is available that has the necessary code to look for and send actions to all Action Handlers found in the Installer application file and script file.
  2440. Apple supplies an Installer Debugger implemented as an Action Handler.  Scriptwriters can write other Action Handlers as needed.
  2441. Writing an Action Handler
  2442. When the Installer first finds and opens the Installer script file it looks for all resources in the script and Installer file with the type ‘inah’.  The ‘inah’ resource contains the type and ID is of the actual Action Handler code resource.  Each of the code resources are loaded into the Installer’s heap and detached.
  2443. An Installer action consists of an action class ID and an action identifier.  When a loggable action occurs in the Installer, each Action Handler code resource is called with a pointer to a Action Handler parameter block.  Action Handlers will be called in order of their resource ID (‘inah’ rsrc ID ).  When called the Action Handler can handle the action however it desires, but remember that other Action Handlers may be called before and after yours.  Depending on the action the Action Handler may be able to modify the result value to effect the progress of the Installer, such as when evaluating rules.
  2444. The Action Handler receives an initialize action when the script is first opened, and a close action when the Installer quits.  Action Handlers can use the initialize action to allocate persistent memory to communicate between invocations of the same Action Handler.  The Action Handler also receives all events that pass through the Installer.
  2445. Action Handler Runtime Environment
  2446. During execution the Action Handler shares memory space with the Installer.  Local memory allocation using Memory Manager calls will come from the Installer’s heap.  Action Handlers should use the Installer’s INewHandle routine to allocate memory that it wishes to persist between calls to the Action Handler.
  2447. Action Handler Reference
  2448. This section describes the data structures, resource descriptions and defined actions needed to use or write Action Handlers.
  2449. Data Structures
  2450. This section describes the function prototype, parameter block structure and defined actions.
  2451. Function Interface
  2452. The Installer calls your Action Handler code resource assuming the following function declaration.
  2453. long HandleAction(     ActionHandlerPBPtr        theActionHandlerPB );
  2454. The Action Handler writer should look at the actionClassID and actionIdentifier to determine how to react to the action.  The four parameters, fParam0, fParam1, fParam2 and fParam3 will contain additional information depending on the action.  You’ll need to include either “ActionHandlerHeader.h” or “ActionHandlerHeader.p” to allow access to the defined action class IDs and action identifiers.
  2455. Parameter Block
  2456. The Installer calls your Action Handler code resource, passing it the following parameter block.
  2457. typedef struct{
  2458. <->    Handle            fStaticDataHdl;
  2459.  —>    ProcPtr            fCallBackProcPtr;
  2460.  —>    short                fTargetVRefNum;
  2461.  —>    long                fTargetFolderDirID;
  2462.  —>    short                fSystemVRefNum;
  2463.  —>    long                fSystemBlessedDirID;
  2464.  ->    short                fActionClassID;
  2465.  ->    short                fActionIdentifier;
  2466.  ->    void*                fParam0;
  2467.  ->    void*                fParam1;
  2468.  ->    void*                fParam2;
  2469.  ->    void*                fParam3;    
  2470.  ->    void*                fResultPtr;    
  2471. } ActionHandlerPB, *ActionHandlerPBPtr;
  2472. Field descriptions 
  2473. fStaticDataHdl    A handle created by the Action Handler using INewHandle to save information between calls to this Action Handler code resource.  The field is always NULL when your Action Handler is initialized.  You can assign a value to this field during any call to the Action Handler, and receive the same value in this field during the next action.
  2474. fCallBackProcPtr    A pointer to the Installer’s dispatch routine.  You’ll need to pass this field as a parameter to Installer function glue routines.
  2475. fTargetVRefNum    The target disk’s vRefNum.  When allowing the user to select a target application folder, this is the volume on which the folder resides.
  2476. fTargetFolderDirID    The target application folder’s directory ID.  This value is -1 if the user cannot select a target application folder.  Target File Specs that use the reserved folder path folder-user will be placed in this folder.
  2477. fSystemVRefNum    The system disk’s vRefNum.  Target File Specs that use the reserved folder path special-xxx will be placed in the System Folder on this volume.
  2478. fSystemBlessedDirID    The directory ID of the System Folder on the disk with the refNum fSystemVRefNum.  This directory is not necessarily the currently active System Folder.
  2479. fActionClassID    The action’s class ID (i.e. a script error.).  Available class IDs are defined in “ActionHandlerHeader.h” and “ActionHandlerHeader.p”. 
  2480. fActionIdentifier    The action’s identifier (i.e. couldn’t find script resource.).  Available identifiers are defined in “ActionHandlerHeader.h” and “ActionHandlerHeader.p”. 
  2481. fParam0..fParam3    Parameters containing extra information for the action.  Contents of the parameters are defined in “ActionHandlerHeader.h” and “ActionHandlerHeader.p” for each action.
  2482. fResultPtr    A pointer to the result variable.  This is used by some actions to enable the Action Handler to change the result, such as with rules and rule clauses.
  2483. Actions
  2484. The following is listing of the current actions supported by the Installer.  See the file “ActionHandlerHeader.h” file for a complete description of all actions.
  2485. Action Class:  kDebuggingAction
  2486. kInitializationActID
  2487. kCloseActID
  2488. kStdEventActID
  2489. kGenericDebugActID
  2490. Action Class:  kScriptAction
  2491. kPackageNotFoundActID
  2492. kAtomNotFoundInPackageActID
  2493. kFrameworkNotFoundActID
  2494. kRuleNotFoundActID
  2495. kFileSpecNotFoundActID
  2496. kFileSpecIsBadActID
  2497. kCouldNotOpenScriptActID
  2498. kFileSpecIDIsBadActID
  2499. kAtomIDIsBadActID
  2500. kNotEnoughMemoryToReadActID
  2501. kSubHeapToSmallActID
  2502. kFileSpecNotFndWithRefActID
  2503. kVersCompareNotFoundActID
  2504. kSearchProcNotFoundActID
  2505. kRuleFunctionNotFoundActID
  2506. Action Class:  kFireRulesAction
  2507. kFrameworkActID
  2508. kRuleResultActID
  2509. kRuleClauseResultActID
  2510. Action Class:  kTargetAction
  2511. kTgtFileNotFoundActID
  2512. kTgtFileLockedActID
  2513. kTgtErrForFileAtomActID
  2514. kTgtErrForRsrcAtomActID
  2515. kTgtErrForFontAtomActID
  2516. kTgtMatchesSrcErrActID
  2517. Action Class:  kSourceAction
  2518. kSrcFileNotFoundActID
  2519. kSrcErrForFileAtomActID
  2520. kSrcErrForRsrcAtomActID
  2521. kSrcErrForFontAtomActID
  2522. kSrcErrForFolderAtomActID
  2523. kSrcErrForResMergeAtomActID
  2524. Action Class:  kExtenderAction
  2525. kExtCodeRsrcNotFoundActID
  2526. kExtenderRsrcNotFoundActID
  2527. kCallBackNotAvailableActID
  2528. kExtenderResultActID
  2529. kA5NotSetCorrectlyActID
  2530. kTgtSetupProcNotFoundActID
  2531. kVersCodeRsrcNotFoundActID
  2532. kActionAtomCodeRsrcNFActID
  2533. kSearchProcCodeRsrcNFActID
  2534. kSearchProcBadFileActID
  2535. kRuleFuncCodeRsrcNFActID
  2536. kLowModuleSetupMemoryActID
  2537. kNoModuleSetupMemoryActID
  2538. Action Class:  kProgressAction
  2539. kClickedInstallActID
  2540. kClickedRemoveActID
  2541. kInstallationResultActID
  2542. kRemovalResultActID
  2543. kActionAtomResultActID
  2544. Action Class:  kFileProgressAction
  2545. kFileCopiedID
  2546. kFileNotCopiedID
  2547. kFileNotCopiedNewerLeftID
  2548. kFileNotCopiedLockedID
  2549. kFileUpdatedID
  2550. kFileNotUpdatedKeptExistID
  2551. kFileNotUpdatedNotExistID
  2552. kFileRemovedID
  2553. kFileNotRemovedID
  2554. kFileNotRemovedNoExistID
  2555. kFileNotRemovedLockedID
  2556. kFileSetLockedID
  2557. Action Class:  kRsrcProgressAction
  2558. kRsrcCopiedID
  2559. kRsrcNotCopiedID
  2560. kRsrcNotCopiedNewerLeftID
  2561. kRsrcNotCopiedNotTargetID
  2562. kRsrcNotCopiedProtectedID
  2563. kRsrcUpdatedID
  2564. kRsrcNotUpdatedKeptExistID
  2565. kRsrcNotUpdatedLockedID
  2566. kRsrcNotUpdatedNotExistID
  2567. kRsrcNotUpdatedProtectedID
  2568. kRsrcRemovedID
  2569. kRsrcNotRemovedID
  2570. kRsrcNotRemovedNoExistID
  2571. kRsrcNotRemovedProtectedID
  2572. kRsrcNotRemovedLockedID
  2573. Action Class:  kFontProgressAction
  2574. kFontCopiedID
  2575. kFontNotCopiedID
  2576. kFontUpdatedID
  2577. kFontNotUpdatedKeptExistID
  2578. kFontNotUpdatedLockedID
  2579. kFontNotUpdatedNotExistID
  2580. kFontNotUpdatedProtectedID
  2581. kFontRemovedID
  2582. kFontNotRemovedID
  2583. kFontNotRemovedNoExistID
  2584. kFontNotRemovedLockedID
  2585. kFontNotRemovedProtectedID
  2586. Action Class:  kFolderProgressAction
  2587. kFolderCopiedID
  2588. Action Class:  kResMergeProgressAction
  2589. kResMergeCopiedID
  2590. Resource Description
  2591. The template of the Action Handler resource is shown below.
  2592. #define    actionHandlerFlags                                        \
  2593.         fill bit[16];
  2594. type 'inah' {
  2595.         switch {
  2596.             case format0:
  2597.                 key integer = 0;            /* Format version */
  2598.                 actionHandlerFlags;        /* Action Handler Flags */
  2599.                 literal longint;            /* Action Handler Code Rsrc Type*/
  2600.                 literal integer;            /* Action Handler Code Rsrc ID*/
  2601.                 longint;                        /* Minimal Required Memory */
  2602.                 evenPaddedString;            /* Description */    
  2603.         };
  2604. };
  2605. Field descriptions 
  2606. Action Handler Flags     Currently reserved for use by Apple Computer, Inc.  (2-bytes)
  2607. Action Handler Code Rsrc Type
  2608. The resource type of the Action Handler code resource.  (4-bytes)
  2609. Action Handler Code Rsrc ID
  2610. The resource ID of the Action Handler code resource.  (2-bytes)
  2611. Minimal Required Memory    The minimum number of free bytes the Action Handler code resource needs during execution.  (4-bytes) 
  2612. Handler Summary    An optional string briefly describing what this Action Handler does.  This string is never displayed to the user.  (even-padded Pascal string) 
  2613. About the Installer Version Resource (‘invs’)
  2614. You may want to ensure that the version of the Installer that you used for development and testing and that you shipped is the one that is launched.  To do so, add an 'invs' Installer Version resource to specify the specific Installer version needed for your script.  If you require Installer 4.0 and a different version is launched and the version specified in this resource is 4.0 then the Installer will display a dialog saying something like “The Installer document [your document's name here] requires version [invs version number here] of the Installer application.  Try opening the Installer application that is in the same folder as this Installer document.”
  2615. The Installer uses the four hex bytes that specify the version number to compare against its own version.  The string is used only in the dialog that is displayed when the two versions do not match.
  2616. The following is an example 'invs' resource for Installer 4.0.3.
  2617. resource 'invs' (1) {
  2618.     format0 {
  2619.         0x4,
  2620.         0x03,
  2621.         release,
  2622.         0x0,
  2623.         "4.0.3"
  2624.     }
  2625. };
  2626. Installer Version Reference
  2627. Resource Description
  2628. Format 0 of the ‘invs’ resource:
  2629. type 'invs' {
  2630.     switch {
  2631.         case format0:
  2632.             key integer = 0;
  2633.             hex byte;            /* Major revision in BCD */
  2634.             hex byte;            /* Minor revision in BCD */
  2635.             hex byte;            /* Release Stage */
  2636.             hex byte;            /* Release Number */
  2637.             pstring;                /* Short Version Number    String */
  2638.     };
  2639. };
  2640. Field descriptions
  2641. Major Revision     The major version number.  (2-bytes)
  2642. Minor Revision     The minor version number.  (2-bytes)
  2643. Release Stage     The release stage.  Four release stage constants are defined in the InstallerTypes.r file:  development, alpha, beta, final and release.  (2-bytes)
  2644. Release Number     The release number.  (2-bytes)
  2645. Short Version Number String     
  2646. Text description of version number.  (even-padded Pascal string) 
  2647. About the Script Size Resource (‘insz’)
  2648. Use of the new script resource, ‘insz’ with an ID of 1 is recommend for scripts over 10K in size.  When the script resources are loaded into memory, they actually go into a sub-heap inside of the Installer’s main heap.  This improves Memory Manager performance on older machines.  In previous versions of the Installer, the size of this sub-heap was always overestimated to account for possibly compressed resources in the script file.  This older scheme has the potential for wasting precious Installer heap memory, requiring a larger application partition.
  2649. ScriptCheck 4.0 calculates this value and automatically places this resource into your script.  The size calculated is calculated using the following script resource types:  'inaa', 'infa', 'inra', 'inff', 'inrm', 'intf', infs', 'inpk', 'inrl', 'infr', 'inex', 'invc', 'insp', 'inat', 'inbb', 'indo', incd', 'insz', 'icmt', 'inpc', 'inr#'.
  2650. Script Size Reference
  2651. Resource Description
  2652. Format 0 of the ‘invs’ resource:
  2653. type 'insz' {
  2654.         switch {
  2655.             case format0:
  2656.                 key integer = 0;        /* Format version */
  2657.                 unsigned longint;        /* Script Sub-Heap Size in bytes */
  2658.         };
  2659. };
  2660. Field descriptions
  2661. Script Sub-Heap Size    The size in bytes the script resources will require when loaded into memory.  This value is used to create an optimally sized sub-heap for the Installer script resources.  (4-bytes)
  2662. About the Script Creation Date Resource (‘incd’)
  2663. The script creation date resource holds a copy of the script file’s creation date field.  This value is used by  the Installer to correctly find and verify the source files when copied to an AppleShare server.  Because the creation date of the source files may have been changed during the copy, the Installer uses the creation date in the ‘incd’ resource to calculate a delta value using the script’s creation date stored in the file by the File Manager.  Without this resource, the user may get an error after beginning the installation saying that the source files could not be found.
  2664. ScriptCheck automatically updates or adds this resource to your script.
  2665. Script Creation Date Reference
  2666. Resource Description
  2667. The ‘incd’ resource:
  2668. type 'incd' {
  2669.         unsigned longint;        /* Script Creation Date in seconds. */
  2670.     };
  2671. };
  2672. Field descriptions
  2673. Script Creation Date    The original creation date in seconds of the script file.  (4-bytes)
  2674.  
  2675. Installation Topics
  2676. This chapter discusses information that may help some scriptwriters keep out of trouble and provide solutions to unique situations.
  2677. Installing Desk Accessories
  2678. Installing into Pre-7.X Systems
  2679. Desk Accessories are installed into the System file as 'DRVR' resources.  The installer will take care of all of the DA's owned resources.  Following is an example of a resource atom used to install a desk accessory.  Flags with the comment /* your choice */ can be either value.
  2680. resource 'inra' (raDAtoInstall) {
  2681.     format0 {
  2682.         deleteWhenRemoving,    /* your choice */
  2683.         deleteWhenInstalling,    /* remove the outdated DA */
  2684.         copy,                /* Copy rsrc to destination */
  2685.         tgtRequired,    /* Target file need already exist to install */
  2686.         updateExisting,    /* your choice */
  2687.         copyIfNewOrUpdate,    /* your choice */
  2688.         ignoreProtection,    /* your choice */
  2689.         srcNeedExist,    /* Rsrc needs to exist on source disk */
  2690.         byName,            /* Use name to find the rsrc */
  2691.         nameMustMatch,    /* ignored */
  2692.         fsTargetSystem,    /* Tgt file spec "System Folder:System File" */
  2693.         fsSourceDA,        /* Source file spec where to get rsrc */
  2694.         'DRVR',            /* Resource type */
  2695.         0,                    /* Resource source id (must be 0) */
  2696.         0,                    /* Resource target id (must be 0) */
  2697.         0,                    /* atom size (filled in by ScriptCheck) */
  2698.         "Desk Accessory: DA name",    /* Atom description */
  2699.         "\0x00DA Name"    /* Resource name */
  2700.     };
  2701. };
  2702. When installing DA's into System 6.0.x and prior, use the 'deleteWhenInstalling' flag in conjunction with the 'updateExisting' flag.  In general, always use the 'deleteWhenInstalling' option when using the 'updateExisting' flag.  Conversely, use the 'dontDeleteWhenInstalling' flag with the 'keepExisting' flag.
  2703. Installing into System 7.X
  2704. Desk Accessories are installed into the Apple Menu Items Folder that is found in the System Folder.  Each Desk Accessory is contained in a single file.  Use a typical 'infa' to install your DA.
  2705.  
  2706. Glossary
  2707. buffering    The act of storing up atom data to be written to the target disk later in the installation.  This reduces the Installer’s need for the target disk, in case the disk is ejectable. 
  2708. folder-user    A reserved target pathname used in target file specs to specify the user-selected application folder.
  2709. “live” installation    An installation where a file in the currently active System Folder will be deleted or modified.  This type of installation always requires that all other applications are quit before beginning the installation.  The original file is never touched, and is saved to provide for cancellation of the installation.
  2710. part    The portion of atom data that is given to an Atom Extender during a kBeforePart and kAfterPart message.  May or may not be the same as the source piece.
  2711. preflighting    The tasks performed after the user clicks the “Install” button and before the status dialog appears.  Some of the tasks performed are:  checking for locked files, checking for protected resources, calculating required target disk space, and checking if a target file equates to a source file.
  2712. special-xxxx    A reserved target pathname used in target file specs to specify a special folder, usually a folder in the System Folder.  The name of the folder is found in a ‘fld#’ resource using the folder type ( where ‘xxxx’ is the type of the folder).
  2713. source pieces    The portions of atom data on the source disk that will be combined during the installation to create the target data.  For example, a large file is split into three files so they will fit onto floppy disks.  Each of the three files would be considered a source piece.
  2714. strike    The combination of size and style of a font.
  2715. Êdˇ ˇˇˇˇd
  2716. d, Palatino
  2717. .+66Installer 4.0.3*Technical Guide,Times
  2718. $(–6
  2719. +®
  2720. (Ô6+Document Version 1.23 -  September 14, 1994ˇ;‰dˇ ˇˇˇˇd
  2721. d, Palatino
  2722. .+~-Table of Contents,     Helvetica
  2723.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )¶2
  2724. °dONLNdc6uÀ(q6Scripting Overview"°∂ u4u0°∂°∂
  2725. °dONLNdˇˇ*Scripting Overview°dONLNdˇˇ)Z ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(ê °dONLNdˇˇ(
  2726. 6°dONLNdˇˇ(ãH-Script Resources for Displaying the Interface°dONLNdˇˇ)à................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..................°dONLNdˇˇ(ã °dONLNdˇˇ)˜6°dONLNdˇˇ(óH'Script Resources for Describing Actions°dONLNdˇˇ)Æ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`............................°dONLNdˇˇ(óˆ °dONLNdˇˇ(ó
  2727. 7°dONLNdˇˇ(£HIndependent Script Resources°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2728. ..........°dONLNdˇˇ(£À °dONLNdˇˇ(£
  2729. 8°dONLNdˇˇ(Ø6Installation Timeline°dONLNdˇˇ)c ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(Øò °dONLNdˇˇ(Ø
  2730. 9°dONLNdˇˇ(ªH    Launching°dONLNdˇˇ)0 ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......°dONLNdˇˇ(ªw °dONLNdˇˇ(ª
  2731. 9°dONLNdˇˇ(«HInstaller Rule Evaluation°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ(«º °dONLNdˇˇ(«
  2732. 9°dONLNdˇˇ(”H Preflighting°dONLNdˇˇ)9 ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...°dONLNdˇˇ(”Å °dONLNdˇˇ(”
  2733. 10°dONLNdˇˇ(flHPreparation to Install/Remove°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......°dONLNdˇˇ(fl‘ °dONLNdˇˇ(fl
  2734. 10°dONLNdˇˇ(ÎH1Reading Source File, Rsrc or Font (for each atom)°dONLNdˇˇ)€ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2735. .............°dONLNdˇˇ(Î# °dONLNdˇˇ)Á11°dONLNdˇˇ(˜H1Writing Target File, Rsrc or Font (for each atom)°dONLNdˇˇ)€ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2736. .............°dONLNdˇˇ(˜# °dONLNdˇˇ)Á11°dONLNdˇˇ(H
  2737. Finalizing°dONLNdˇˇ)0 ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......°dONLNdˇˇ(x °dONLNdˇˇ(
  2738. 11
  2739. °dONLNdˇˇ(&6Installer Human Interface"°∂ *4*0°∂°∂
  2740. °dONLNdˇˇ*Easy Install Interface°dONLNdˇˇ)c ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(4ò °dONLNdˇˇ(4
  2741. 12°dONLNdˇˇ(@HUsing the Target Disk Interface°dONLNdˇˇ)ê ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......°dONLNdˇˇ(@◊ °dONLNdˇˇ(@
  2742. 13°dONLNdˇˇ(LH&Using the Application Folder Interface°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(L˘ °dONLNdˇˇ(L
  2743. 13°dONLNdˇˇ(XHButtons°dONLNdˇˇ)$ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2744. ..........°dONLNdˇˇ(Xj °dONLNdˇˇ(X
  2745. 13°dONLNdˇˇ(d6Custom Install Interface°dONLNdˇˇ)o ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......................°dONLNdˇˇ(d£ °dONLNdˇˇ(d
  2746. 14°dONLNdˇˇ(pHCustom Install List°dONLNdˇˇ)W ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(pû °dONLNdˇˇ(p
  2747. 14°dONLNdˇˇ(|H-Selected Size and Disk Space Available Values°dONLNdˇˇ)€ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2748. .............°dONLNdˇˇ(|! °dONLNdˇˇ)È15°dONLNdˇˇ(àHCustom Item Information°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(à∏ °dONLNdˇˇ(à
  2749. 15°dONLNdˇˇ(î6Custom Remove Interface°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(î® °dONLNdˇˇ(î
  2750. 16°dONLNdˇˇ(†6'Selecting the Target Application Folder°dONLNdˇˇ)∑ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ(†Ï °dONLNdˇˇ(†
  2751. 17°dONLNdˇˇ(¨6Selecting the System Volume°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(¨∫ °dONLNdˇˇ(¨
  2752. 18°dONLNdˇˇ(∏6Adding a Splash Screen°dONLNdˇˇ)l ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........................°dONLNdˇˇ(∏¢ °dONLNdˇˇ(∏
  2753. 19°dONLNdˇˇ(ƒ6Providing User Help°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`............................°dONLNdˇˇ(ƒî °dONLNdˇˇ(ƒ
  2754. 20°dONLNdˇˇ(–6Selecting an Installer Document°dONLNdˇˇ)ê ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(–≈ °dONLNdˇˇ(–
  2755. 20°dONLNdˇˇ(‹6Menus°dONLNdˇˇ) ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..................°dONLNdˇˇ(‹R °dONLNdˇˇ(‹
  2756. 21°dONLNdˇˇ(ËH
  2757. Apple Menu°dONLNdˇˇ)9 ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...°dONLNdˇˇ(Ë °dONLNdˇˇ(Ë
  2758. 22°dONLNdˇˇ(ÙH    Help Menu°dONLNdˇˇ)3 ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....°dONLNdˇˇ(Ùz °dONLNdˇˇ(Ù
  2759. 22°dONLNdˇˇ(HApplication Menu°dONLNdˇˇ)T ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ(ö °dONLNdˇˇ(
  2760. 22°dONLNdˇˇ( 60Using the Installer Preference Resource (‘inpr’)°dONLNdˇˇ)’ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(      °dONLNdˇˇ( 
  2761. 22°dONLNdˇˇ(H,Controlling the Recommended Target Selection°dONLNdˇˇ)’ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ( °dONLNdˇˇ)Ó23°dONLNdˇˇ($HSpecifying Help Pages°dONLNdˇˇ)i ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ($Ø °dONLNdˇˇ($
  2762. 23°dONLNdˇˇ(0H-Allowing Installation onto AppleShare Volumes°dONLNdˇˇ)fi ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(0% °dONLNdˇˇ)Â24°dONLNdˇˇ(<6'Installer Preference Resource Reference°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.°dONLNdˇˇ(<Ê °dONLNdˇˇ(<
  2763. 24°dONLNdˇˇ(HHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(H¶ °dONLNdˇˇ(H
  2764. 24°dONLNdˇˇ(THData Structures°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(Tè °dONLNdˇˇ(T
  2765. 26
  2766. °dONLNdˇˇ(w6Packages and Atoms"°∂ {4{0°∂°∂
  2767. °dONLNdˇˇ*About Packages (‘inpk’)°dONLNdˇˇ)l ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........................°dONLNdˇˇ(Ö¢ °dONLNdˇˇ(Ö
  2768. 27°dONLNdˇˇ(ë6Using Packages°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....°dONLNdˇˇ(ë| °dONLNdˇˇ(ë
  2769. 27°dONLNdˇˇ(ùH Using Packages with Easy Install°dONLNdˇˇ)ô ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...°dONLNdˇˇ(ù‡ °dONLNdˇˇ(ù
  2770. 27°dONLNdˇˇ(©H-Using Packages with Custom Install and Remove°dONLNdˇˇ)fi ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(©$ °dONLNdˇˇ)Ê27°dONLNdˇˇ(µHAtom Execution Order°dONLNdˇˇ)c ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(µ´ °dONLNdˇˇ(µ
  2771. 28°dONLNdˇˇ(¡6Package Reference°dONLNdˇˇ)T ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ(¡ä °dONLNdˇˇ(¡
  2772. 28°dONLNdˇˇ(ÕHPackage Resource Description°dONLNdˇˇ)á ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`    .........°dONLNdˇˇ(ÕŒ °dONLNdˇˇ(Õ
  2773. 28°dONLNdˇˇ(ŸH$Package Comment Resource Description°dONLNdˇˇ)¥ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ(Ÿ˙ °dONLNdˇˇ(Ÿ
  2774. 30ˇERdˇ ˇˇˇˇd
  2775. d, Palatino
  2776. .+~-Table of Contents,     Helvetica
  2777.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )¶3
  2778. °dONLNdˇˇ(ZZ(New Package Comment Resource Description°dONLNdˇˇ)à................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(Z$ °dONLNdˇˇ)Ê30°dONLNdˇˇ(fZ(Old Package Comment Resource Description°dONLNdˇˇ)Δ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............°dONLNdˇˇ(f  °dONLNdˇˇ)Í31°dONLNdˇˇ(r6About the File Atom°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(rì °dONLNdˇˇ(r
  2779. 32°dONLNdˇˇ(~6Using the File Atom (‘infa’)°dONLNdˇˇ)Å ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.................°dONLNdˇˇ(~µ °dONLNdˇˇ(~
  2780. 32°dONLNdˇˇ(äHComparing Files by Version°dONLNdˇˇ)~ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(ä≈ °dONLNdˇˇ(ä
  2781. 32°dONLNdˇˇ(ñH#Using Split Sources with File Atoms°dONLNdˇˇ)• ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ(ñÏ °dONLNdˇˇ(ñ
  2782. 33°dONLNdˇˇ(¢H$Using Atom Extenders with File Atoms°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(¢¯ °dONLNdˇˇ(¢
  2783. 33°dONLNdˇˇ(ÆHInstalling a Custom Folder Icon°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......°dONLNdˇˇ(Æ‘ °dONLNdˇˇ(Æ
  2784. 34°dONLNdˇˇ(∫6File Atom Reference°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(∫í °dONLNdˇˇ(∫
  2785. 34°dONLNdˇˇ(ΔHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(Δ¶ °dONLNdˇˇ(Δ
  2786. 34°dONLNdˇˇ(“6 About the Resource Atom (‘inra’)°dONLNdˇˇ)ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2787. ..........°dONLNdˇˇ(“  °dONLNdˇˇ(“
  2788. 38°dONLNdˇˇ(fi6Using the Resource Atom°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(fi¶ °dONLNdˇˇ(fi
  2789. 39°dONLNdˇˇ(ÍHComparing Files By Version°dONLNdˇˇ)Å ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ...........°dONLNdˇˇ(Í« °dONLNdˇˇ(Í
  2790. 39°dONLNdˇˇ(ˆH'Using Split Sources with Resource Atoms°dONLNdˇˇ)∫ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........................°dONLNdˇˇ(ˆ °dONLNdˇˇ(ˆ
  2791. 39°dONLNdˇˇ(H(Using Atom Extenders with Resource Atoms°dONLNdˇˇ)Δ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....................°dONLNdˇˇ(  °dONLNdˇˇ)˛39°dONLNdˇˇ(6Resource Atom Reference°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(¶ °dONLNdˇˇ(
  2792. 40°dONLNdˇˇ(HResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(¶ °dONLNdˇˇ(
  2793. 40°dONLNdˇˇ(&6%About the Resource List Atom (‘inr#’)°dONLNdˇˇ)® ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....°dONLNdˇˇ(&fi °dONLNdˇˇ(&
  2794. 44°dONLNdˇˇ(26Using the Resource List Atom°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(2∫ °dONLNdˇˇ(2
  2795. 44°dONLNdˇˇ(>H-Referencing Resource Atom Lists from Packages°dONLNdˇˇ)’ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ(> °dONLNdˇˇ)Ó44°dONLNdˇˇ(J6Resource List Atom Reference°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(J∫ °dONLNdˇˇ(J
  2796. 44°dONLNdˇˇ(VHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(V¶ °dONLNdˇˇ(V
  2797. 45°dONLNdˇˇ(b6About the Font Atom (‘inff’)°dONLNdˇˇ)Å ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.................°dONLNdˇˇ(bµ °dONLNdˇˇ(b
  2798. 46°dONLNdˇˇ(n6Using the Font Atom°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(nì °dONLNdˇˇ(n
  2799. 46°dONLNdˇˇ(zH"Auto-Routing Under Pre-7.1 Systems°dONLNdˇˇ)• ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ(zÏ °dONLNdˇˇ(z
  2800. 46°dONLNdˇˇ(ÜH$Using Atom Extenders with Font Atoms°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(ܢ °dONLNdˇˇ(Ü
  2801. 47°dONLNdˇˇ(í6Font Atom Reference°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(íì °dONLNdˇˇ(í
  2802. 47°dONLNdˇˇ(ûHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(û¶ °dONLNdˇˇ(û
  2803. 47°dONLNdˇˇ(™6 About the ResMerge Atom (‘inrm’)°dONLNdˇˇ)ú ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........°dONLNdˇˇ(™— °dONLNdˇˇ(™
  2804. 53°dONLNdˇˇ(∂6Using the ResMerge Atom°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(∂´ °dONLNdˇˇ(∂
  2805. 53°dONLNdˇˇ(¬6ResMerge Atom Reference°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(¬´ °dONLNdˇˇ(¬
  2806. 54°dONLNdˇˇ(Œ6About the Folder Atom (‘infm’)°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2807. .............°dONLNdˇˇ(Œ√ °dONLNdˇˇ(Œ
  2808. 55°dONLNdˇˇ(⁄6Using the Folder Atom°dONLNdˇˇ)i ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(⁄ù °dONLNdˇˇ(⁄
  2809. 55°dONLNdˇˇ(ÊH'Specifying the Source and Target Folder°dONLNdˇˇ)∑ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(Ê˝ °dONLNdˇˇ(Ê
  2810. 56°dONLNdˇˇ(ÚH$Installing Folders with Custom Icons°dONLNdˇˇ)• ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ(ÚÌ °dONLNdˇˇ(Ú
  2811. 56°dONLNdˇˇ(˛H)Creating Empty Folders with a Folder Atom°dONLNdˇˇ)… ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(˛ °dONLNdˇˇ)˙56°dONLNdˇˇ(
  2812. 6Folder Atom Reference°dONLNdˇˇ)i ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(
  2813. ù °dONLNdˇˇ(
  2814. 
  2815. 56°dONLNdˇˇ(6Using Action Atoms (‘inaa’)°dONLNdˇˇ)~ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..................°dONLNdˇˇ(¥ °dONLNdˇˇ(
  2816. 57°dONLNdˇˇ("6Action Atom Reference°dONLNdˇˇ)i ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ("ù °dONLNdˇˇ("
  2817. 57°dONLNdˇˇ(.HResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(.¶ °dONLNdˇˇ(.
  2818. 58°dONLNdˇˇ(:HData Structures°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(:è °dONLNdˇˇ(:
  2819. 59°dONLNdˇˇ(FZFunction Interface°dONLNdˇˇ)Q ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(F´ °dONLNdˇˇ(F
  2820. 59°dONLNdˇˇ(RZParameter Block°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(R¶ °dONLNdˇˇ(R
  2821. 59°dONLNdˇˇ(^6Using Audit Atoms (‘inat’)°dONLNdˇˇ){ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(^Ø °dONLNdˇˇ(^
  2822. 61°dONLNdˇˇ(j6Audit Atom Reference°dONLNdˇˇ)f ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ(jö °dONLNdˇˇ(j
  2823. 61°dONLNdˇˇ(vHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(v¶ °dONLNdˇˇ(v
  2824. 61°dONLNdˇˇ(Ç6Using Boot Block Atoms (‘inbb’)°dONLNdˇˇ)ê ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(Ç≈ °dONLNdˇˇ(Ç
  2825. 62°dONLNdˇˇ(é6Boot Block Atom Reference°dONLNdˇˇ){ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(é∞ °dONLNdˇˇ(é
  2826. 62°dONLNdˇˇ(öHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(ö¶ °dONLNdˇˇ(ö
  2827. 62°dONLNdˇˇ(¶6About Atom Extenders (‘inex’)°dONLNdˇˇ)á ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ(¶Ω °dONLNdˇˇ(¶
  2828. 65°dONLNdˇˇ(≤6Writing Atom Extenders°dONLNdˇˇ)o ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......................°dONLNdˇˇ(≤§ °dONLNdˇˇ(≤
  2829. 66°dONLNdˇˇ(æH"Creating an ‘inex’ Script Resource°dONLNdˇˇ)ô ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...°dONLNdˇˇ(æfl °dONLNdˇˇ(æ
  2830. 66°dONLNdˇˇ( HWriting a Simple Atom Extender°dONLNdˇˇ)ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....°dONLNdˇˇ( › °dONLNdˇˇ( 
  2831. 66°dONLNdˇˇ(÷H'Memory Allocation within Atom Extenders°dONLNdˇˇ)√ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(÷  °dONLNdˇˇ)ˇ69ˇ>@dˇ ˇˇˇˇd
  2832. d, Palatino
  2833. .+~-Table of Contents,     Helvetica
  2834.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )¶4
  2835. °dONLNdˇˇ(ZHRunning within a Sub-Heap°dONLNdˇˇ)~ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(ZΔ °dONLNdˇˇ(Z
  2836. 69°dONLNdˇˇ(fH&Converting Existing Decompression Code°dONLNdˇˇ)∑ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(fˇ °dONLNdˇˇ(f
  2837. 70°dONLNdˇˇ(r6Atom Extender Reference°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(rß °dONLNdˇˇ(r
  2838. 70°dONLNdˇˇ(~HResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(~¶ °dONLNdˇˇ(~
  2839. 70°dONLNdˇˇ(äHData Structures°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(äè °dONLNdˇˇ(ä
  2840. 72°dONLNdˇˇ(ñZFunction Interface°dONLNdˇˇ)Q ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(ñ´ °dONLNdˇˇ(ñ
  2841. 72°dONLNdˇˇ(¢ZParameter Block°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(¢¶ °dONLNdˇˇ(¢
  2842. 72°dONLNdˇˇ(Æ6(About Version Compare Functions (‘invc’)°dONLNdˇˇ)∫ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(Æ °dONLNdˇˇ(Æ
  2843. 76°dONLNdˇˇ(∫H/Using Version Compare Functions with File Atoms°dONLNdˇˇ)‰ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2844. ..........°dONLNdˇˇ(∫+ °dONLNdˇˇ)fl76°dONLNdˇˇ(ΔH3Using Version Compare Functions with Resource Atoms°dONLNdˇˇ)˘ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...°dONLNdˇˇ(Δ? °dONLNdˇˇ)À77°dONLNdˇˇ(“H#Version Compare Runtime Environment°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(“˘ °dONLNdˇˇ(“
  2845. 77°dONLNdˇˇ(fi6"Version Compare Function Reference°dONLNdˇˇ)• ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....°dONLNdˇˇ(fi⁄ °dONLNdˇˇ(fi
  2846. 77°dONLNdˇˇ(ÍHFunction Interface°dONLNdˇˇ)Q ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(Íô °dONLNdˇˇ(Í
  2847. 77°dONLNdˇˇ(ˆHParameter Block°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`............................°dONLNdˇˇ(ˆî °dONLNdˇˇ(ˆ
  2848. 78°dONLNdˇˇ(HResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(¶ °dONLNdˇˇ(
  2849. 78
  2850. °dONLNdˇˇ(%6Installer Rules"°∂ )4)0°∂°∂
  2851. °dONLNdˇˇ*Frameworks (‘infr’)°dONLNdˇˇ)Z ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(3è °dONLNdˇˇ(3
  2852. 79°dONLNdˇˇ(?HGlobal Rule Framework°dONLNdˇˇ)l ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..................°dONLNdˇˇ(?¥ °dONLNdˇˇ(?
  2853. 79°dONLNdˇˇ(KHEasy Install Rule Framework°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2854. ..........°dONLNdˇˇ(Kà°dONLNdˇˇ(K
  2855. 79°dONLNdˇˇ(WHCustom Install Rule Framework°dONLNdˇˇ)ê ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......°dONLNdˇˇ(W◊ °dONLNdˇˇ(W
  2856. 80°dONLNdˇˇ(c6Rules (‘inrl’)°dONLNdˇˇ)< ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........°dONLNdˇˇ(cp °dONLNdˇˇ(c
  2857. 80°dONLNdˇˇ(oHUsing Assertions°dONLNdˇˇ)K ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(oì °dONLNdˇˇ(o
  2858. 82°dONLNdˇˇ({6Rule Clause Reference°dONLNdˇˇ)f ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ({ö °dONLNdˇˇ({
  2859. 83°dONLNdˇˇ(áHGlobal Rule Clauses°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......................°dONLNdˇˇ(ᣠ°dONLNdˇˇ(á
  2860. 83°dONLNdˇˇ(ìHEasy Install Rule Clauses°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ(쪠°dONLNdˇˇ(ì
  2861. 91°dONLNdˇˇ(üHCustom Install Rule Clauses°dONLNdˇˇ)~ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ(üΔ °dONLNdˇˇ(ü
  2862. 92
  2863. °dONLNdˇˇ(¬6File Specification"°∂ Δ4Δ0°∂°∂
  2864. °dONLNdˇˇ*About File Specifications°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(–© °dONLNdˇˇ(–
  2865. 93°dONLNdˇˇ(‹6 Specifying Target Files (‘intf’)°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2866. .............°dONLNdˇˇ(‹¡ °dONLNdˇˇ(‹
  2867. 93°dONLNdˇˇ(ËHInstalling into Special Folders°dONLNdˇˇ)ä ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........°dONLNdˇˇ(Ë“ °dONLNdˇˇ(Ë
  2868. 93°dONLNdˇˇ(ÙH4Installing into the User-Selected Application Folder°dONLNdˇˇ) ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......°dONLNdˇˇ(Ù7 °dONLNdˇˇ)”94°dONLNdˇˇ(H-Managing Rollbacks on Multiple Target Volumes°dONLNdˇˇ)fi ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ............°dONLNdˇˇ($ °dONLNdˇˇ)Ê94°dONLNdˇˇ( H$Installing onto the Installer Volume°dONLNdˇˇ)• ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ( Π°dONLNdˇˇ( 
  2869. 95°dONLNdˇˇ(H"Setting the Finder flags and Dates°dONLNdˇˇ)ú ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..°dONLNdˇˇ(‰ °dONLNdˇˇ(
  2870. 95°dONLNdˇˇ($6 Specifying Source Files (‘infs’)°dONLNdˇˇ)ä ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............°dONLNdˇˇ($¿ °dONLNdˇˇ($
  2871. 95°dONLNdˇˇ(0HSource Disk Search Path°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(0∏ °dONLNdˇˇ(0
  2872. 95°dONLNdˇˇ(<6File Spec. Reference°dONLNdˇˇ)] ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(<ë °dONLNdˇˇ(<
  2873. 96°dONLNdˇˇ(HHResource Descriptions°dONLNdˇˇ)c ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(H™ °dONLNdˇˇ(H
  2874. 96°dONLNdˇˇ(TZ#Target File Spec. Resource (‘intf’)°dONLNdˇˇ)ô ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(TÒ °dONLNdˇˇ(T
  2875. 96°dONLNdˇˇ(`Z"Source File Spec Resource (‘infs’)°dONLNdˇˇ)ì ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............................°dONLNdˇˇ(`Ì °dONLNdˇˇ(`
  2876. 98°dONLNdˇˇ(l6About File Searching (‘insp’)°dONLNdˇˇ)Ñ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`................°dONLNdˇˇ(lπ °dONLNdˇˇ(l
  2877. 99°dONLNdˇˇ(xH1Using File Searching with File and Resource Atoms°dONLNdˇˇ)Í ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`........°dONLNdˇˇ(x0 °dONLNdˇˇ)⁄99°dONLNdˇˇ(ÑH&Using File Searching with Rule Clauses°dONLNdˇˇ)¥ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ(Ѹ °dONLNdˇˇ(Ñ
  2878. 99°dONLNdˇˇ(êH3Allowable Installer Functions During File Searching°dONLNdˇˇ)Ì ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......°dONLNdˇˇ(ê5 °dONLNdˇˇ)’99°dONLNdˇˇ(ú6File Searching Reference°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(úß °dONLNdˇˇ(ú
  2879. 100°dONLNdˇˇ(®HData Structures°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(®è °dONLNdˇˇ(®
  2880. 100°dONLNdˇˇ(¥ZFunction Interface°dONLNdˇˇ)Q ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(¥´ °dONLNdˇˇ(¥
  2881. 100°dONLNdˇˇ(¿ZParameter Block°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(¿¶ °dONLNdˇˇ(¿
  2882. 100°dONLNdˇˇ(ÃHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(ö °dONLNdˇˇ(Ã
  2883. 101°dONLNdˇˇ(ÿ6&About the Disk Order Resource (‘indo’)°dONLNdˇˇ)± ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.°dONLNdˇˇ(ÿ °dONLNdˇˇ(ÿ
  2884. 102ˇ&ÿdˇ ˇˇˇˇd
  2885. d, Palatino
  2886. .+~-Table of Contents,     Helvetica
  2887.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )¶5
  2888. °dONLNdˇˇ(Z6Disk Order Reference°dONLNdˇˇ)c ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...........................°dONLNdˇˇ(Zó °dONLNdˇˇ(Z
  2889. 103°dONLNdˇˇ(fHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(f¶ °dONLNdˇˇ(f
  2890. 103
  2891. °dONLNdˇˇ(â6Installer Functions"°∂ ç4ç0°∂°∂
  2892. °dONLNdˇˇ*About Installer Functions°dONLNdˇˇ)r ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(óß °dONLNdˇˇ(ó
  2893. 104°dONLNdˇˇ(£ZData I/O Routines°dONLNdˇˇ)T ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....................°dONLNdˇˇ(£Æ °dONLNdˇˇ(£
  2894. 104°dONLNdˇˇ(ØZMemory Routines°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(Ø® °dONLNdˇˇ(Ø
  2895. 108°dONLNdˇˇ(ªZMisc. Routines°dONLNdˇˇ)B ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..........................°dONLNdˇˇ(ªõ °dONLNdˇˇ(ª
  2896. 110
  2897. °dONLNdˇˇ(fi6Miscellaneous Features"°∂ ‚4‚0°∂°∂
  2898. °dONLNdˇˇ*About Action Handlers°dONLNdˇˇ)i ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(Ïû °dONLNdˇˇ(Ï
  2899. 113°dONLNdˇˇ(¯HWriting an Action Handler°dONLNdˇˇ){ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2900. .............°dONLNdˇˇ(¯√ °dONLNdˇˇ(¯
  2901. 113°dONLNdˇˇ(H"Action Handler Runtime Environment°dONLNdˇˇ)´ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.............................°dONLNdˇˇ(Ú °dONLNdˇˇ(
  2902. 114°dONLNdˇˇ(6Action Handler Reference°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ(´ °dONLNdˇˇ(
  2903. 114°dONLNdˇˇ(HData Structures°dONLNdˇˇ)H ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............................°dONLNdˇˇ(è °dONLNdˇˇ(
  2904. 114°dONLNdˇˇ((ZFunction Interface°dONLNdˇˇ)Q ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.....................°dONLNdˇˇ((´ °dONLNdˇˇ((
  2905. 114°dONLNdˇˇ(4ZParameter Block°dONLNdˇˇ)N ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(4¶ °dONLNdˇˇ(4
  2906. 114°dONLNdˇˇ(@ZActions°dONLNdˇˇ)$ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`....°dONLNdˇˇ(@| °dONLNdˇˇ(@
  2907. 115°dONLNdˇˇ(LHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(L¶ °dONLNdˇˇ(L
  2908. 117°dONLNdˇˇ(X6-About the Installer Version Resource (‘invs’)°dONLNdˇˇ)… ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.........................°dONLNdˇˇ(X˛ °dONLNdˇˇ(X
  2909. 118°dONLNdˇˇ(d6Installer Version Reference°dONLNdˇˇ){ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(d± °dONLNdˇˇ(d
  2910. 119°dONLNdˇˇ(pHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(p¶ °dONLNdˇˇ(p
  2911. 119°dONLNdˇˇ(|6'About the Script Size Resource (‘insz’)°dONLNdˇˇ)Æ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..°dONLNdˇˇ(|‚ °dONLNdˇˇ(|
  2912. 119°dONLNdˇˇ(à6Script Size Reference°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`............................°dONLNdˇˇ(àñ °dONLNdˇˇ(à
  2913. 119°dONLNdˇˇ(îHResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(î¶ °dONLNdˇˇ(î
  2914. 119°dONLNdˇˇ(†60About the Script Creation Date Resource (‘incd’)°dONLNdˇˇ)€ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(† °dONLNdˇˇ)˙120°dONLNdˇˇ(¨6Script Creation Date Reference°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`
  2915. .............°dONLNdˇˇ(¨√ °dONLNdˇˇ(¨
  2916. 120°dONLNdˇˇ(∏HResource Description°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`......................°dONLNdˇˇ(∏¶ °dONLNdˇˇ(∏
  2917. 120
  2918. °dONLNdˇˇ(€6Installation Topics"°∂ fl4fl0°∂°∂
  2919. °dONLNdˇˇ*Installing Desk Accessories°dONLNdˇˇ){ ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...................°dONLNdˇˇ(ȱ °dONLNdˇˇ(È
  2920. 121°dONLNdˇˇ(ıHInstalling into Pre-7.X Systems°dONLNdˇˇ)ç ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`.......°dONLNdˇˇ(ı‘ °dONLNdˇˇ(ı
  2921. 121°dONLNdˇˇ(HInstalling into System 7.X°dONLNdˇˇ)u ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`...............°dONLNdˇˇ(Ω °dONLNdˇˇ(
  2922. 122
  2923. °dONLNdˇˇ($6Glossary"°∂ (4(0°∂°∂
  2924. °dONLNdˇˇ*Glossary°dONLNdˇˇ)* ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)` ................................°dONLNdˇˇ)`..............°dONLNdˇˇ(2^ °dONLNdˇˇ(2
  2925. 123ˇ
  2926. ˙dˇ ˇˇˇˇd
  2927. d, Palatino
  2928. .+~-C  H  A  P  T  E  R      1,     Helvetica
  2929.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )¶6
  2930. $°dONLNdQ~y≥(o~Scripting Overview"°∂ 40°∂°∂
  2931. °dONLNdÃ~*ô*∏?This chapter provides an overview of writing Installer scripts.
  2932. °dONLNd B6V—(Q6Scripting Overview"°∂ V4V0°∂°∂
  2933. °dONLNd[~g++HhAn Installer script is a list of instructions for the Installer, in the form of resources.  These script°dONLNdàg~s#* bresources tell the Installer how to perform an Installation.  An Installer script is written using°dONLNdÎs~* Rthe MPW (Macintosh Programmer's Workshop) Rez language, and compiled using the MPW°dONLNd>~ã'* ^Rez tool.  It is expected that Installer scriptwriters are familiar with the Rez language, MPW°dONLNdùã~óH* )development system, and the MPW Rez tool.°dONLNd«ü~´!*`The script resources can be divided into three main groups:  script resources for displaying the°dONLNd(´~∑* ]interface, script resources for describing what actions to perform during the installation or°dONLNdÜ∑~√=* *removal, and independent script resources.
  2934. °dONLNd±◊~Êì*"-Script Resources for Displaying the Interface"°∂ Â|Â0°∂°∂
  2935. °dONLNdflÍ~ˆ,*`The scriptwriter is responsible for providing a recommended software selection for Easy Install,°dONLNd@ˆ~* Yand an optional list of software choices for Custom Install.  Each interface requires the°dONLNdö~,* cscriptwriter to create instructions (Installer rules) that are evaluated to tell the Installer what°dONLNd˛~Á* Oto display to the user and what will happen during the installation or removal.°dONLNdP"~. *aIt is useful to think of script resources as working in a hierarchy.  At the top of the hierarchy°dONLNd≤.~:«* are framework (,
  2936. Courier°dONLNd¡.«:Î)I‘infr’°dONLNd«.Î:)$ ) and rule (°dONLNd”.:@)1‘inrl’°dONLNdŸ.@:&)$7) script resources.  The Installer uses these resources°dONLNd:~F(C~Xto examine the environment and make decisions about what to install based on what it has°dONLNdjF~R(* `found on the user’s target disk.  For example, in System Software, we install different software°dONLNdÀR~^* ^depending on the type of machine the Installer is running on, the type of target disk the user°dONLNd*^~j* \has chosen, and what has previously been installed.  To use these features, the scriptwriter°dONLNdáj~v∂* Hmust provide a set of if-then rules to reach the goal of each interface.°dONLNd–~~ä˝*Easy Install interface goals:,
  2937.  
  2938. Zapf Dingbats
  2939.     °dONLNdÓî~ùÖ*n
  2940. °dONLNdíêû")VCreate the recommended software message that will be shown in the Easy Install dialog.°dONLNdHûê™-* \This translates into including the proper rule clauses that will display the desired message°dONLNd•™ê∂»* or error text.
  2941.     °dONLNd¥¿~…Ö(«~n
  2942. °dONLNd∂æê ,)`Tell the Installer what actions to take after the user clicks the Install button.  This requires°dONLNd ê÷—* Ithe scriptwriter to add to the list of packages that should be installed.ˇÕ¥dˇ ˇˇˇˇd
  2943. d, Palatino
  2944. .+~*C  H  A  P  T  E  R      1,     Helvetica
  2945.     *Scripting Overview(Ú~Installer 4.0.3 Technical Guide(ÚÉ )°7
  2946. °dONLNdQ~](Z~Custom Install interface goals:,
  2947.  
  2948. Zapf Dingbats
  2949.     °dONLNd g~pÖ*n
  2950. °dONLNd"eêq$)ZSpecify the software components to be listed in the Custom Install dialog.  Each top-level°dONLNd}qê}* Witem equates to a package, with possible sub-packages, that the scriptwriter explicitly°dONLNd’}êâÿ* adds to the list.°ddPro†Ç†å††°§P]
  2951. "ID#˛˚##ˇ˚##########ˇ##ˇ#Ñ
  2952. í톣
  2953. ë~{Å4?AGF?AFˇAABˇBEFˇDBCˇGCEˇˇ†°††°§P
  2954. ##˝ˆ######ˇ##ˇ#]Ñ
  2955. í톣
  2956. ë~{Å4?AFF?AFˇ@ABˇBEFˇCBCˇFCEˇˇ#˝ˆ###ˇ#ˇ#†°††°§P
  2957. "HC#˝ˆ######ˇ##ˇ#†£
  2958. ë~{#˝ˆ###ˇ#ˇ#†°"$C†ç†å††°§P]
  2959. "ID#˙ˇ##˚ˇ##˛##ˇ##ˇ##ˇ#####Ñ
  2960. í톣
  2961. ë~{Å`B9IDB<=ˇC;<=>ˇD:;>?ˇE9:?AˇFABˇG9<BCˇH<ACDˇIADˇˇ†°††°§P
  2962. ##ı˛##˝##˛#####]Ñ
  2963. í톣
  2964. ë~{Å`B9IDB<=ˇC;<=>ˇD:;>?ˇE?@ˇF9:@AˇG9<ABˇH<ABDˇIADˇˇ#ı˛#˝#˛###†°††°§P
  2965. "HC#ı˛##˝##˛######†£
  2966. ë~{#ı˛#˝#˛###†°"(˚>†ç†å††°§P]
  2967. "ID#¸##˝##########˚##˚#Ñ
  2968. í톣
  2969. ë~{Å\BDINBKLˇCJKLMˇDIJˇEGIMNˇFFGˇGEFMNˇHDEHMˇIDHˇˇ†°††°§P
  2970. ##˘######˚##˚#]Ñ
  2971. í톣
  2972. ë~{ÅPBFHNBKLˇCJKLMˇDIJˇEHIMNˇFGHˇGFGMNˇHFMˇˇ#˘###˚#¸#ˇ†°††°§P
  2973. "HC#˘######˚##˙##†£
  2974. ë~{#˘###˚#¸#ˇ†°"(㡆砠  Ä1%~    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1˜~    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  2975. ˘q,Times
  2976.     .ˇÍëÍë¿°dONLNdˇˇ+Ñ|Global Rule Framework†ô†ó†ú
  2977. ë~{1˜8†õ°ñ †ò°ddPro$
  2978.     
  2979. C¿°dONLNdˇˇ(
  2980.  
  2981. 'infr' ID=765†ô†ó†ú
  2982. ë~{    Ä1Ü7¸    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1    Ü¸    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  2983.  é¿°dONLNdˇˇ(ëEasy Install Rule Framework†ô†ó†ú
  2984. ë~{1    Üê8†õ°ñ †ò°ddPro$
  2985. á(Ω¿°dONLNdˇˇ($ä
  2986. 'infr' ID=764†ô†ó†ú
  2987. ë~{    Ä1ã7    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1    ã    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  2988.  츿°dONLNdˇˇ(ñCustom Install Framework†ô†ó†ú
  2989. ë~{1    ãï8†õ°ñ †ò°ddPro$
  2990. å)≈¿°dONLNdˇˇ($è
  2991. 'infr' ID=766†ô†ó†ú
  2992. ë~{    Ä1U
  2993. zÉ    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1H
  2994. WÉ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  2995. JXN¿°dONLNdˇˇ(SInstaller Rule†ô†ó†ú
  2996. ë~{1H
  2997. W8ˇˇˇˇˇˇ    1g#v~    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  2998. j,xj¿°dONLNdˇˇ+  Rule Clause…†ô†ó†ú
  2999. ë~{1g#v+8†õ°ñ †ò°ddPro$
  3000. Yg)¿°dONLNdˇˇ(b'inrl'†ô†ó†ú†å††°§P]
  3001. "
  3002. æ#˛˚##ˇ˚##########˛##ˇ#Ñ
  3003. í톣
  3004. ë~{Å<ª¡ª¡ˇ¿¡ˇªºˇø¿ˇºΩˇΩøˇˇ†°††°§P
  3005. ##˝ˆ######ˇ##˛#]Ñ
  3006. í톣
  3007. ë~{ÅDª¡ª¡ˇªºˇ¿¡ˇºΩˇø¿ˇΩæˇæøˇˇ#˝ˆ###ˇ#˛#†°††°§P
  3008. "    Ω#˝ˆ######˛##ˇ#†£
  3009. ë~{#˝ˆ###˛#ˇ#†°"ÚΩ
  3010. †ç†å††°§P]
  3011. "
  3012. …#˛˚##ˇ˚##########ˇ##ˇ#Ñ
  3013. í톣
  3014. ë~{Å4ΔÀΔÀˇΔ«ˇ Àˇ«»ˇ» ˇˇ†°††°§P
  3015. ##˝ˆ######ˇ##ˇ#]Ñ
  3016. í톣
  3017. ë~{Å4ΔÀΔÀˇΔ«ˇ Àˇ«»ˇ» ˇˇ#˝ˆ###ˇ#ˇ#†°††°§P
  3018. "    »#˝ˆ######ˇ##ˇ#†£
  3019. ë~{#˝ˆ###ˇ#ˇ#†°"Ú»
  3020. †çòʼn"OG
  3021. 2HH∞Ñ kġˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôôˇˇÃÃffˇˇÃÃ33ˇˇÃÃˇˇôôˇˇˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃÃˇˇôôˇˇffˇˇ33ˇˇÃÃˇˇˇˇÃÃˇˇÃÃÃÃˇˇôôÃÃˇˇffÃÃˇˇ33ÃÃˇˇÃÃÃÃˇˇÃÃÃÃÃÃÃÃÃÃôôÃÃÃÃffÃÃÃÃ33ÃÃÃÃÃÃôôˇˇÃÃôôÃÃÃÃôôôôÃÃôôffÃÃôô33ÃÃôôÃÃffˇˇÃÃffÃÃÃÃffôôÃÃffffÃÃff33ÃÃffÃÃ33ˇˇÃÃ33ÃÃÃÃ33ôôÃÃ33ffÃÃ3333ÃÃ33ÃÃˇˇÃÃÃÃÃÃôôÃÃffÃÃ33ÃÃôôˇˇˇˇôôˇˇÃÃôôˇˇôôôôˇˇffôôˇˇ33ôôˇˇôôÃÃˇˇôôÃÃÃÃôôÃÃôôôôÃÃffôôÃÃ33ôôÃÃôôôôˇˇôôôôÃÃôôôôôôôôôôffôôôô33ôôôôôôffˇˇôôffÃÃôôffôôôôffffôôff33ôôffôô33ˇˇôô33ÃÃôô33ôôôô33ffôô3333ôô33ôôˇˇôôÃÃôôôôôôffôô33ôôffˇˇˇˇffˇˇÃÃffˇˇôôffˇˇffffˇˇ33ffˇˇffÃÃˇˇffÃÃÃÃffÃÃôôffÃÃffffÃÃ33ffÃÃffôôˇˇffôôÃÃffôôôôffôôffffôô33ffôôffffˇˇffffÃÃffffôôffffffffff33ffffff33ˇˇff33ÃÃff33ôôff33ffff3333ff33ffˇˇffÃÃffôôffffff33ff33ˇˇˇˇ33ˇˇÃÃ33ˇˇôô33ˇˇff33ˇˇ3333ˇˇ33ÃÃˇˇ33ÃÃÃÃ33ÃÃôô33ÃÃff33ÃÃ3333ÃÃ33ôôˇˇ33ôôÃÃ33ôôôô33ôôff33ôô3333ôô33ffˇˇ33ffÃÃ33ffôô33ffff33ff3333ff3333ˇˇ3333ÃÃ3333ôô3333ff333333333333ˇˇ33ÃÃ33ôô33ff333333ˇˇˇˇˇˇÃÃˇˇôôˇˇffˇˇ33ˇˇÃÃˇˇÃÃÃÃÃÃôôÃÃffÃÃ33ÃÃôôˇˇôôÃÃôôôôôôffôô33ôôffˇˇffÃÃffôôffffff33ff33ˇˇ33ÃÃ33ôô33ff333333ˇˇÃÃôôff33ÓÓ››ªª™™ààwwUUDD""ÓÓ››ªª™™ààwwUUDD""ÓÓ››ªª™™ààwwUUDD""ÓÓÓÓÓÓ››››››ªªªªªª™™™™™™ààààààwwwwwwUUUUUUDDDDDD"""""""OG
  3022. 2ímÙ ŎŎŎüˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇˇÅˇøˇßŎ“ˇˆˇ˚ˇˇˇUAˇÅ∂ˇˇÓˇˇˆˇˇˇˇ˚¸ˇ¸ˇ˛ˇˇˇˇ¸ˇÅ…ˇ¸ˇ˛ˇ˘ˇˇQˇÅˇøˇ˘ˇˇÓˇˇˆˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¸ˇ˛ˇ˚ˇˇˇTˇÅ∂ˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇÅ ˇ¸ˇ˛ˇ˘ˇˇ˚iˇÅˇøˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¸ˇ˛ˇ˚ˇˇˇUVˇÅ∂ˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇ˚˝ˇ˛ˇˇˇˇ˚ˇˇˇˇˇÅ ˇ¸ˇ˛ˇ˘ˇˇ˛cˇÅˇøˇ˘ˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3023. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇ˙ˇ˛ˇ˚ˇˇˇ˛ZˇÅ∂ˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3024. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇÅ ˇ¯ˇ˘ˇˇUeˇÅˇøˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3025. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¯ˇ˚ˇˇˇNˇÅ∂ˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇ˚ˇˇ¸¸ˇ˛ˇˇˇˇ¸ˇÅ…ˇ¯ˇ˘ˇˇUˇÅˇøˇßŎ“ˇˆˇ˚ˇˇˇˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇU
  3026. ŎŎŎûˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇ˛ˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇıÅˇËˇÅÅΔˇˇˇıˇÅ͡Åü∑ˇÚˇˇ˛ˇıˇÅÍˇÅ°ˇˇ∑ˇˇÙˇˇUˇıˇÅ͡ˇÅ¢ˇµˇÙˇˇˇıˇÅ͡ˇÅ£ˇ≥ˇıˇˇUˇıˇÅ͡ˇÅ£ˇ≥ˇıˇˇUEˇıˇÒ˝ˇÓˇˇÂˇˇÓˇˇˆˇˇˇˇ◊ˇˇÅ£ˇÁˇˇˇˇ˜ˇˇflˇıˇˇ˝NˇıˇÚˇˇ˛ˇÔˇˇÂˇˇÓˇˇˆˇˇˇˇËıˇ¸ˇˇÅ£ˇÁˇˇˇˇ˜ˇˇflˇıˇˇ˚qˇıˇÚˇˇ˚ˇˇˇˇ˛˛ˇ˛˝ˇ˛˝ˇ˛¯ˇ˘ˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇÁ˜ˇ˚ˇˇÅ£ˇÁˇˇˇˇ˛˝ˇ˛ˇˇ¸ˇÊˇıˇˇñˇıˇÚˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇÊ˘ˇ˙ˇˇÅ£ˇÁˇˇˇˇˇˇˇˇˇˇˇˇˇˇÁˇıˇˇ˛àˇıˇÚˇˇ˚ˇˇˇˇ˛ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇÂ˚ˇ˘ˇˇÅ£ˇÁ˚ˇˇˇˇˇˇˇˇˇˇˇÁˇıˇˇ˛çˇıˇÚˇˇ˚ˇˇˇˇ˛˛ˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3027. ˇˇˇˇˇˇˇˇ‰˝ˇ¯ˇˇÅ£ˇÁˇˇˇˇ˚ˇ ˇˇˇˇˇˇÁˇıˇˇéˇıˇÚˇˇ˚ˇˇˇˇ˝˛ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3028. ˇˇˇˇˇˇˇˇ„ˇˇ˜ˇˇÅ£ˇÁ    ˇˇˇˇˇˇ˚    ˇˇˇˇˇˇÁˇıˇˇ˝ïˇıˇÚˇˇ˛ˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3029. ˇˇˇˇˇˇˇˇ◊ˇˇÅ£ˇÁ    ˇˇˇˇˇˇ˛ ˇˇˇˇˇˇˇÁˇıˇˇUwˇıˇÒ˝ˇ˝¸ˇ˛˛ˇ¸ˇˇ˛˝ˇ˛    ˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇ◊ˇˇÅ£ˇÁˇˇˇˇ˛˝ˇ˛ˇˇ¸ˇÊˇıˇˇU"ˇıˇÅ͡ˇÅ£ˇ”ˇˇ„ˇıˇˇ"ˇıˇÅ͡ˇÅ£ˇ”ˇˇ„ˇıˇˇ˚ˇıˇÅ͡ˇÅ£ˇ≥ˇıˇˇ˛ˇıˇÅ͡ˇÅ¢ˇµˇÙˇˇUˇıŎÁˇÅ¢ˇˇ∑ˇˇÙˇˇUˇÚÅˇÍˇÅ†∑ˇÚˇˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇ˛ˇÅÅۡˇ˛ˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇUˇıŎŎŎπˇıˇˇ˛ˇıˇÅÅÅ ˇÛˇıˇˇUˇıˇÅÅÅ ˇÛˇıˇˇ'ˇıˇÓıˇÅÅŘ¯ˇ¸ˇ˚ˇˇ˚ˇıˇˇbˇıˇ˚ˇıˇ˜ˇ˘˛ˇÓˇˇÂ˛ˇÙ˛ˇˇˇ÷˛ˇ“ˇ˘ˇˇˇˆˇˇÔˇˇÅÊˇ¯ˇ˝ˇ¸ˇˇ¸ˇıˇˇpˇıˇ˚ˇˇˆˇ˜ˇ˙ˇˇˇÔˇˇÊˇˇˇˆˇˇ˝ˇˇ◊ˇˇ–ˇˇ˚ˇˇ„ˇˇÔˇˇÅÊˇ˝ˇ˝ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇUÃˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇˇ¸ˇˇˇˇ˛˛ˇ˛˝ˇ˛˝ˇ˛¯ˇ˙ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇ˙˝ˇ˛˝ˇ˛ˇˇˇˇ˚˝ˇ˛¸ˇ˛ˇˇˇˇ˚˛ˇ˝˛ˇ˛˝ˇ˝˛ˇ˛ˇˇ¸ˇ˛˝ˇ˛˝ˇ˝˛ˇ˛¸ˇÅÈˇ¯ˇˇ˛ˇ˛ˇ˚ˇ˛ˇıˇˇU
  3030. ˇıˇ˚ˇˇ¯ˇ˜ˇ˙˛ˇ˝ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛ˇ˙ˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˝ˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇÅ͡˛ˇˇ˝ˇˇ˛ˇˇ˘ˇˇıˇˇU˝ˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˘˛ˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇ˙ˇˇ˛    ˇˇˇˇˇˇ¯¸ˇˇˇˇˇˇˇˇˇ˚ˇ¸ˇˇˇ˛¸ˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˛ˇ˝ˇˇˇˇÅ͡˝ˇ˝ˇˇ˛ˇ˝ˇ˝˝ˇˇıˇˇ˛ˇıˇ˚ˇ˝ˇ˙ˇ˜ˇ¯˛ˇˇˇˇˇ˛˛ˇ˝ˇˇ˛˚ˇ ˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇ˙ˇˇ˛    ˇˇˇˇˇˇ˘ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇ˛ˇˇˇˇˇˇˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˛˛ˇ˛ˇˇˇˇÅ͡˝ˇ˝ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇ˛ˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˜    ˇˇˇˇˇˇ˝˛ˇ˛ˇˇ˛ˇˇ˚    ˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˆˇˇ˛    ˇˇˇˇˇˇ˘ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇ˛ˇ˛
  3031. ˇˇˇˇˇˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˝˛ˇˇˇˇˇÅ͡˛˛ˇ˛ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇUˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇ˙ˇˇ˛    ˇˇˇˇˇˇ˘ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇÅ͡¯ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇUƒˇıˇ˚ˇˇ˜ˇ˜ˇ˘˛ˇ˝¸ˇ˛˛ˇ¸ˇˇ˛˝ˇ˛    ˇˇˇˇˇˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇ˘ˇˇ˝˝ˇ˛ˇˇ¯¸ˇˇˇˇˇ˛¸ˇ˚ˇ˙ˇˇ˛¸ˇ˛˛ˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛˝ˇ˝˛ˇ˛ˇˇˇˇÅȈˇ˛ˇ˝˚ˇ˝ˇıˇˇ3ˇıˇ˚ˇˇˆˇ˜ˇÔˇˇÅÌˇˇÅ†¯ˇ˝ˇÛˇıˇˇU2ˇıˇ˚ˇııˇÛˇ˛ˇˇÅÒˇ˛ˇˇÅìˇÛˇıˇˇ˚ˇıˇ”˝ˇÅÔ˝ˇÅíÒˇıˇˇUˇıˇÅÅÅ Òˇıˇˇ˛ˇıˇÅÅÅ ˇˇıˇˇıˇˇUˇıˇÅÅÅ ˇˇıˇˇıˇˇ˝$ˇıˇÓıˇÅÅŘ¯ˇ¸ˇˇıˇˇıˇˇAˇıˇ˚ˇıˇ˜ˇ˙¸ˇ¯ˇˇˆˇˇ˛ˇˇÅۡ¯ˇ˝ˇˇıˇˇıˇˇUBˇıˇ˚ˇˇˆˇ˜ˇ˙ˇˇˇˇÏˇˇÅÅúˇ˝ˇ˝ˇˇ˛ˇˇıˇˇıˇˇYˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇ¸ˇ˛˝ˇˇˇ¸ˇ˝¸ˇÅűˇ¯ˇˇ˛ˇˇıˇˇıˇˇkˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇˇˇ˛ˇ˛    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅűˇ˛ˇˇ˝ˇˇ˛ˇˇıˇˇıˇˇUgˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙¸ˇ˛ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅűˇ˝ˇ˝ˇˇ˛ˇˇıˇˇıˇˇ˛hˇıˇ˚ˇ˝ˇ˙ˇ˜ˇ˙ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅűˇ˝ˇ˝ˇˇ˛ˇˇıˇˇıˇˇ˛hˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅűˇ˛˛ˇ˛ˇˇ˛ˇˇıˇˇıˇˇcˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅűˇ¯ˇˇ˛ˇˇıˇˇıˇˇUXˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˝
  3032. ˇˇˇˇˇˇˇˇ˛¸ˇÅÅ∞ˆˇ˛ˇˇıˇˇıˇˇ0ˇıˇ˚ˇˇˆˇ˜ˇ ˇˇÅÅØ¯ˇ˝ˇˇıˇˇıˇˇ˝+ˇıˇ˚ˇııˇŒˇ˛ˇˇÅÅ¢ˇˇıˇˇıˇˇˇıˇÆ˝ˇÅÅ°ÒˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ-ˇıˇÓıˇÅÅŘ¯ˇ¸ˇ˛ˇ˛ˇ˛ˇˇıˇˇhˇıˇ˚ˇıˇ˜ˇ˘˝ˇŸˇˇ˛ˇˇˇˇ˚    ˇˇˇˇˇˇ˛ˇˇÒ˛ˇÙ˛ˇˇˇÅÅÛˇ¯ˇ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇlˇıˇ˚ˇˇˆˇ˜ˇ˙ˇˇ˛ˇ⁄ˇˇ˙ˇˇ˜ˇˇ˙ˇˇÚˇˇˇˆˇˇ˝ˇˇÅÅÛˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˚£ˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇˇ˙˝ˇ˛¯ˇ˛¸ˇ˝˝ˇ˛˝ˇˇˇ¸ˇ˛ ˇˇˇˇˇˇ˝ˇˇˇˇˇ˚ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅïˇ¯ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇÕˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅñˇ˛ˇˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUΔˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙ˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛¸ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅñˇ˝ˇ˝ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛»ˇıˇ˚ˇ˝ˇ˙ˇ˜ˇ˙ˇˇ˚!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅñˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛…ˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙ˇˇ˚!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅíˇ˛˛ˇ˛ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇUŒˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇ˛$ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅñˇ¯ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇñˇıˇ˚ˇˇ˜ˇ˜ˇ˘˝ˇ˝˝ˇ˛ ˇˇˇˇˇˇ¸ˇ˝¸ˇ˝ˇˇˇˇ¸ˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛¸ˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅîˆˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU>ˇıˇ˚ˇˇˆˇ˜ˇfiˇˇÀˇˇÅÅ”¯ˇ˝ˇ˛ˇ˛ˇ˛ˇˇıˇˇ9ˇıˇ˚ˇııˇfiˇˇœˇ˛ˇˇÅÅΔˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˚'ˇıˇä˝ˇÅÅ≈ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU-ˇıˇÓıˇÅÅŘ¯ˇ¸ˇ˛ˇ˛ˇ˛ˇˇıˇˇU`ˇıˇÓˇ˜ˇ˙ˇ˘ˇ˜ˇˇ˛ˇˇ˛ˇˇÁˇˇˇˇÚ˛ˇÙ˛ˇˇˇÅÅ¡¯ˇ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇUcˇıˇÓˇ˜ˇ˙ˇˇ˚ˇˇ˜ˇˇ˛ˇˇ‚ˇˇÔˇˇˇˆˇˇ˝ˇˇÅÅ¡˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇîˇıˇÓˇ˜ˇ˙˛ˇ˝˛ˇ
  3033. ˇˇˇˇˇˇ˝ˇˇˇ¯ˇ˝˝ˇ˝¸ˇˇˇ˛˝ˇ˙ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅáˇ¯ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇUºˇıˇˆˇ˚ˇ˜ˇ˙˝ˇ˝ˇ ˇˇˇˇˇˇ˛ˇˇ˛$ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅàˇ˛ˇˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUΩˇıˇ˛ˇ˙ˇ˙ˇ˚ˇˇ˙ˇ¸ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛¸ˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅàˇ˝ˇ˝ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛∫ˇıˇ˝ˇ¸ˇ˘ˇ˜ˇ˙ˇ˛ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅàˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛ªˇıˇ¸ˇ˛ˇ¯ˇ˜ˇ˙ˇ˛ˇ˛
  3034. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅÑˇ˛˛ˇ˛ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇªˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇ˙
  3035. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅàˇ¯ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇåˇıˇ˙ˇˆˇ˜ˇ˙ˇ˙ˇˇ˛¸ˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˛˝ˇ˝¸ˇˇˇ˛¸ˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅ܈ˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ1ˇıˇÓˇ˜ˇÅÅň¯ˇ˝ˇ˛ˇ˛ˇ˛ˇˇıˇˇU)ˇıˇÓıˇÅÅÅÈˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU+ˇıˇ⁄ıˇÅÅã¯ˇ¸ˇ˛ˇ˛ˇ˛ˇˇıˇˇUIˇıˇ⁄ˇ˜ˇ˘˝ˇˆˇˇ¯ˇˇ¸˚ˇˇˇÅÅæˇ¯ˇ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˝Kˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇÏˇˇ˙ˇˇÅÅπˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUhˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇ˛˛ˇ˛ˇˇˇˇ˛ˇˇ˛ˇˇ¯ˇ˝˝ˇÅÅ—ˇ¯ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇzˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇÅÅ“ˇ˛ˇˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛sˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇ¸˝ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇÅÅ“ˇ˝ˇ˝ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛oˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇ¸˛ˇ˚ˇˇ˛ˇˇˇˇˇˇˇˇ˚ˇÅÅ“ˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇoˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇ¸˝ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇÅÅŒˇ˛˛ˇ˛ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˝uˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˛ˇÅÅ“ˇ¯ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUcˇıˇ⁄ˇ˜ˇ˘˝ˇ˝¸ˇˇˇ˛˛ˇ˛ˇˇˇˇ˛ˇˇ˛
  3036. ˇˇˇˇˇˇˇˇ˛˝ˇÅÅ–ˆˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU4ˇıˇ⁄ˇ˜ˇˆˇˇÅÅó¯ˇ˝ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˚)ˇıˇ⁄ıˇÅÅÅ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ+ˇıˇ⁄ıˇÅÅã¯ˇ¸ˇ˛ˇ˛ˇ˛ˇˇıˇˇUMˇıˇ⁄ˇˇ˘ˇˇ˘˝ˇ˛¸ˇ˜¸ˇ˝˝ˇ˛ˇ˘ˇÅѡ¯ˇ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇgˇıˇ⁄ˇˇ˚ˇˇ˙ˇˇ˛ˇˇˇˇˇ¯ˇˇˇˇˇˇˇˇˇˇ˚ˇˇÅѡ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇaˇıˇ⁄ˇˇ˝ˇˇ˙ˇˇ˚ˇˇˇˇ¯ˇˇˇˇˇˇˇˇ˛ˇ˝˛ˇÅѡ¯ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˚hˇıˇ⁄ˇ˛ˇˇ˛ˇ˙ˇˇ˚ˇˇˇˇ¯ˇˇˇˇˇˇˇˇ˝ˇ˝ˇÅѡ˛ˇˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛gˇıˇ⁄ˇ˝ˇˇ˝ˇ˙ˇˇ˚ˇˇˇˇ¸ˇ¸ˇ˛    ˇˇˇˇˇ¸ˇˇˇÅѡ˝ˇ˝ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛hˇıˇ⁄ˇ˝ˇˇ˝ˇ˙ˇˇ˚ˇˇˇˇ¯ˇˇˇˇˇˇˇˇˇ˛ˇˇˇÅѡ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUjˇıˇ⁄ˇ˛ˇˇ˛ˇ˙ˇˇ˚ˇˇˇˇ¯ˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇÅѡ˛˛ˇ˛ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇdˇıˇ⁄ˇˇ˝ˇˇ˙ˇˇ˛ˇˇˇˇˇ¯ˇˇˇˇˇˇˇˇˇ˙ˇˇÅѡ¯ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUQˇıˇ⁄ˇˇ˚ˇˇ˘˝ˇ˛¸ˇ˜ˇˇˇˇ˛˝ˇ˛ˇ˙ˇˇÅÅ√ˆˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ1ˇıˇ⁄ˇˇ˘ˇˇÅÅ䝎˝ˇ˛ˇ˛ˇ˛ˇˇıˇˇ)ˇıˇ⁄ıˇÅÅÅ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇ%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ+ˇıˇ⁄ıˇÅÅã¯ˇ¸ˇ˛ˇ˛ˇ˛ˇˇıˇˇJˇıˇ⁄ˇ˜ˇ˘˝ˇÚˇˇˇˇÔˇˇ¯ˇˇÅÅÃˇ¯ˇ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇUFˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇÛˇˇÅÅ©ˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUpˇıˇ⁄ˇ˜ˇ˙
  3037. ˇˇˇˇˇˇˇˇ˛¸ˇˇˇ˛˝ˇ˛    ˇˇˇˇˇˇ˛˛ˇ˛ˇˇ˛˝ˇ˛¸ˇÅÅ€ˇ¯ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇÖˇıˇ⁄ˇ˜ˇ˙HˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÅÅ‹ˇ˛ˇˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛~ˇıˇ⁄ˇ˜ˇ˙˚ˇ)ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇ˝ˇˇˇˇˇˇˇˇˇˇÅÅ‹ˇ˝ˇ˝ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛Çˇıˇ⁄ˇ˜ˇ˙-ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛˛ˇ˛ˇˇˇˇˇˇˇˇˇˇÅÅ‹ˇ˝ˇ˝ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇUǡıˇ⁄ˇ˜ˇ˙-ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝˛ˇˇˇˇˇˇˇˇˇˇˇÅÅ‹ˇ˛˛ˇ˛ˇˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇÄˇıˇ⁄ˇ˜ˇ˙(ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÅÅ‹ˇ¯ˇˇ˛ˇ˛ˇ˛ˇ˛ˇˇıˇˇhˇıˇ⁄ˇ˜ˇ˙ˇˇˇˇ˛¸ˇ˛¸ˇˇˇ˛˝ˇ˛˝ˇ˝ˇˇ˛˛ˇ˛ˇˇ˛˝ˇ˛ˇˇˇˇÅÅ€ˆˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU/ˇıˇ⁄ˇ˜ˇÅÅ䝎˝ˇ˛ˇ˛ˇ˛ˇˇıˇˇU)ˇıˇ⁄ıˇÅÅÅ˝ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˛%ˇıˇÅÅÅ ˇˇ˛ˇ˛ˇ˛ˇˇıˇˇU%ˇıˇÅÅÅ ˇ˛ˇ˛ˇ˛ˇˇıˇˇ˝ˇıˇÅÅÅ Òˇıˇˇ"ˇıˇÓıˇÅÅŘ¯ˇ¸ˇÛˇıˇˇnˇıˇ˚ˇıˇ˜ˇ˘˝ˇˆˇˇˇˇ˜ˇˇ‰ˇˇ˛ˇˇÍ˝ˇ¯ˇ¸ˇˆˇˇ‰ˇˇ˚ˇˇÍ˛ˇÙ˛ˇˇˇÅ“ˇ¯ˇ˝ˇÛˇıˇˇ~ˇıˇ˚ˇˇˆˇ˜ˇ˙ˇˇ˛ˇ˜ˇˇˇˇ˜ˇˇ‰ˇˇÊˇˇˇˇ˘ˇˇ˝ˇˆˇˇ‰ˇˇ„ˇˇˇˆˇˇ˝ˇˇÅ“ˇ˝ˇ˝ˇˇ˛ˇ˝˚ˇ˝ˇıˇˇ˚Êˇıˇ˚ˇˇ˜ˇ˜ˇ˙ˇˇ˙˝ˇ˛ˇˇˇˇ˛˝ˇ˛¸ˇ˝˝ˇ˛ˇˇˇˇ˝ˇ˛˝ˇˇˇ˛˝ˇ˛¸ˇ˙ˇˇˇˇˇ˚˛ˇ˛ˇ˛˝ˇ˛˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇˇˇˇˇˇˇ¸ˇ˝¸ˇ˚ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅÙˇ¯ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇUˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇ˚ˇˇˇˇˇˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇ˛ˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˝ˇ˚˝ˇ
  3038. ˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅıˇ˛ˇˇ˝ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇ˛ˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙ˇˇ˚
  3039. ˇˇˇˇˇˇˇˇ˛¸ˇˇˇˇˇˇˇˇˇˇˇ¸¸ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇ˛ˇ˙ˇ˛ˇ    ˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˝ˇ˝ˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅıˇ˝ˇ˝ˇˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇ˛ˇıˇ˚ˇ˝ˇ˙ˇ˜ˇ˙ˇˇ˚)ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˘ˇ˝ˇ˚ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˛ˇ¸ˇˇˇˇˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅıˇ˝ˇ˝ˇˇ˛ˇ˝ˇ˝˝ˇˇıˇˇˇıˇ˚ˇ˛ˇ˘ˇ˜ˇ˙ˇˇ˚)ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˘ˇ˛˛ˇˇˇ˙ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˝ˇ˝ˇˇˇˇˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅÒˇ˛˛ˇ˛ˇˇ˛ˇˇ˘ˇˇıˇˇUˇıˇ˚ˇˇ¯ˇ˜ˇ˙ˇˇ˛,ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˘ˇ˝ˇˇˇˇ˛ˇ˛ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅıˇ¯ˇˇ˛ˇ˛ˇ˚ˇ˛ˇıˇˇÀˇıˇ˚ˇˇ˜ˇ˜ˇ˘˝ˇ˝˝ˇ˛ˇˇˇˇ˛¸ˇ¸ˇ˝˝ˇ˛ˇˇ¸¸ˇ˝ˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˙˝ˇ¯ˇ¸ˇ˛˝ˇ¸ˇˇ˘ˇ¸˝ˇ˛ˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˛¸ˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅÛˆˇ˛ˇ˝ˇ˝ˇ˝ˇıˇˇ˝5ˇıˇ˚ˇˇˆˇ˜ˇÅ«ˇˇÅ≤¯ˇ˝ˇ¸ˇˇ¸ˇıˇˇ.ˇıˇ˚ˇııˇÅÀˇ˛ˇˇÅ•ˇ˚ˇˇ˚ˇıˇˇUˇıˇÅ´˝ˇÅ§ˇÛˇıˇˇ˛ˇıˇÅÅÅ ˇÛˇıˇˇUˇıŎŎŎπˇıˇˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUpˇÕ˛ˇ˝ˇ˚ˇÕˇˇˇ˚ˇ˝ˇˇÚ¸ˇ˝ˇ¸ˇ˛ˇˇ¸ˇ˛ˇˇ˛ˇÅ²ˇ˙ˇˇıˇ˜ˇ˜ˇÌ¸ˇ¸ˇ¸ˇˇ˛ˇ◊ˇˇfˇÕˇˇ˜ˇ ˇ˚ˇ¸ˇÔˇ˝ˇˇˇ˚ˇ˙ˇˇ˛ˇˇˇÅ¡˛ˇ˙ˇıˇ˜ˇflˇ¸ˇ˚ˇˇˇ÷ˇˇU«ˇÕˇ˛ˇˇˇ˛ˇˇˇ¸˛ˇ˛ˇ˛ˇˇ˛ˇˇ˛ˇˇ˚ˇˇˇ˛ˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇ˝ˇ˘ˇ˝ˇˇ˝ˇˇ˙ˇ˙ˇˇˇÅ‰ˇ˚ˇˇ˛ˇˇˇ˛ˇˇ˛ˇˇˇ˛˛ˇ¸˛ˇˇˇ˝ˇˇˇ˝ˇ˘ˇ¸ˇ˚ˇˇˇ’ˇˇ˛¿ˇÕˇ˛ˇˇˇ˝ˇˇ¸ˇ˝ˇˇ˝
  3040. ˇˇˇˇˇ˙ˇˇˇ¸ˇˇˇ˝
  3041. ˇˇˇˇˇˇˆ˛ˇˇˇ˚ˇ˝ˇ˛˛ˇ¸ˇˇˇÅ‚˛ˇ ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇ¸ˇ˛ˇˇˇˆ˛ˇ˛˛ˇ¸ˇˇˇ‘ˇˇ˛∏ˇÕˇ˛ ˇˇˇˇˇˇ˙    ˇˇˇˇ˛ˇˇ˝˝ˇ¸˛ˇˇˇ˛˛ˇˇˇ˛ˇˇˇˇ˝ˇÛˇ¸ˇ¸ˇˇ˛ˇ¸ˇ˛ˇ˛ˇˇÅ‡ˇ˝ˇˇ˝ˇˇ¸ˇ˝ˇˇˇ¸ˇˇ˛ˇˇ˛˝ˇÛˇ¸ˇ˛ˇ˛ˇˇ’ˇˇUÃˇÕˇˇ˛ˇ˝ˇˇˇ˘ˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇˇÙˇ˛ˇ˝ˇˇ˛ˇˇ˛ˇˇ˛ˇˇ˝ˇˇÅ¡˛ˇˇ¸ˇˇ˝    ˇˇˇˇ˝ˇˇ˙ˇˇˇ˝ˇÙˇ˛ˇˇ˛ˇ˛ˇ˛ˇˇ÷ˇˇUƒˇÕ˛ˇ˝ˇ˛ˇˇˇ˝˛ˇ˛ˇ˛˛ˇˇˇ˛ˇˇ˚˛ˇ˛ˇ˝˛ˇˇˇ˛ˇ˛ˇ˛ˇˇˇ˝ˇ˙˛ˇ¸ˇ˛˛ˇ˛˛ˇ˛˛ˇ¸ˇˇ˛ˇÅ²ˇ˛ˇˇ˛ˇˇˇ˛ˇˇ˝ˇˇˇ˛˛ˇ˝˛ˇ˛ˇ˝ˇˇˇ˝ˇ˙˛ˇ˛˛ˇ˝ˇ˛ˇ˛ˇ◊ˇˇUˇ≤ˇÅÅÅÒˇˇˇ≤ˇÅÅÅÒˇˇˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇU6ˇÊˇˇÛˇˇ˘˛ˇ˛ˇ˘ˇˇ˛ˇˇ˝ˇ˝ˇˇ˙ˇˇÅÅêˇˇU1ˇÊˇˇÛˇˇ¯ˇˇˇˇ˘ˇˇÎˇˇˇˇıˇˇÅÅêˇˇYˇÊˇˇ˝ˇ˛˝ˇ˝ˇ˛ˇ˛ˇˇˇˇ˛ˇ˝ˇ˛ˇ˛ˇ˝ˇ˚ˇˇˇˇ˛ˇ˝ˇˇˇˇˇÅÅìˇˇ˚ˇıˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ¸ˇˇ¸    ˇˇˇˇˇˇ˝ˇˇˇˇ˛
  3042. ˇˇˇˇˇˇˇˇˇˇ¸ ˇˇˇˇˇˇˇˇ˝˝ˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ0ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÅ»ˇˇU]ˇÊ    ˇˇˇˇˇˇ˛ˇ˛ˇˇ˛˝ˇ    ˇˇˇˇ˝ˇˇˇ˛
  3043. ˇˇˇˇˇˇˇˇˇˇ¸ ˇˇˇˇˇˇ˛ˇ˛ˇÅÅ롡˛gˇıˇÛˇˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛
  3044. ˇˇˇˇˇˇˇˇˇˇ¸ˇˇˇˇ˛ˇˇ˝ˇˇ˝ˇÅÃˇÅ»ˇˇ˛YˇÊˇˇˇˇˇˇ˝ˇ˝ˇˇ˝ˇ    ˇˇˇˇ˝ˇ˛ˇˇˇˇ˛ˇˇˇˇˇ¸˝ˇ˝ˇˇ˝ˇˇˇˇˇÅÅìˇˇˇıˇÅÅˡ¿∑ˇ”ˇˇˇÅÅõˇˇ∑ˇˇ’ˇˇˇıˇÅÅˡ¬ˇµˇ’ˇˇˇÅÅúˇ≥ˇ÷ˇˇUˇıˇÅÅˡ√ˇ≥ˇ÷ˇˇU$ˇÅÕ¢ˇØˇÂ˝ˇˆˇˇ˛ˇˇÂˇ÷ˇˇU2ˇıˇÅ‹ˇˇ¢ˇˇˇ√ˇÊˇˇˇˇÚˇˇÂˇ÷ˇˇU3ˇÅœˇ†ˇ±ˇÊˇˇˇˇˇˇˇˇˇˇ˝ˇÊˇ÷ˇˇU<ˇıˇÅ›ˇûˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇU4ˇÅ–ˇûˇ≤ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇ˝\ˇıˇÅ›ˇÔˇˇˇ¸ˇÓˇ˙ˇˇˇ˛ˇˆˇÎˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇUHˇÅ–ˇÓˇÊˇ¯ˇ˛ˇÙˇÍˇ≤ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇnˇıˇÅ›ˇÔˇ¯ˇ˛ˇˇ¸ˇˇ˛ˇˇ˙ˇ˛ˇ˛ˇ¸ˇ¸ˇ˛ˇÔˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇU`ˇÅ–ˇÓˇ˙ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ¯ˇ˛ˇ˛ˇ˛ˇ¸ˇ˛ˇÓˇ≤ˇÂ˝ˇ˝¸ˇˇˇ˝ˇˇÊˇ÷ˇˇ˛YˇıˇÅ›ˇÔˇˇ˙ˇ˛ˇ˛ˇ˛ˇ˙ˇ˙ˇ˛ˇ˛ˇ˛ˇˇ¸ˇˇÌˇÒˇ√ˇ‚ˇˇ‘ˇ÷ˇˇ˛JˇÅ–ˇÓˇ˙ˇ˛ˇˇˇ˛ˇ˙ˇ¯ˇ˛ˇ˛ˇ˛ˇˇ˛ˇˇÏˇ≤ˇ≥ˇ÷ˇˇ˝NˇıˇÅ›ˇÔˇ¯ˇ˛ˇ˙ˇ˙ˇ˙ˇ˛ˇ˛ˇ¸ˇˇ˛ˇˇÌˇÒˇ√ˇ≥ˇ÷ˇˇJˇÅ–ˇÓˇ˙ˇ˛ˇ˙ˇ˛ˇ˛ˇ¯ˇ˛ˇ˛ˇ¸ˇ˛ˇ˛ˇÓˇ±ˇµˇ’ˇˇUXˇıˇÅ›ˇÔˇˇˇ¸ˇ˛ˇˇ¸ˇˇ¸ˇ˙ˇˇˇ˛ˇ¸ˇ¸ˇ˛ˇÔˇÒˇ¬ˇˇ∑ˇˇ’ˇˇUˇÅ–ˇÊˇ∫ˇØ∑ˇ”ˇˇ$ˇıˇÅ›ˇÈˇ˛ˇªˇÒˇÅ»ˇˇUˇÅ–ˇËˇˇ∫ˇÅ∑ˇˇUˇıˇÅ‹ˇ†ˇˇÅ»ˇˇUˇÅœˇˇ¢ˇˇÅ∂ˇˇˇıˇÅ⁄¢ˇÓˇÅ»ˇˇUˇÅÅۡˇˇıˇƒ„ˇÅ√ˇÅ»ˇˇ˚ˇ∏ˇ„ˇÅÅ䡡ˇıˇ≈ˇ„ˇÅƒˇÅ»ˇˇ˛ˇ∏ˇ„ˇÅÅ䡡˛ˇıˇ≈ˇ„ˇÅƒˇÅ»ˇˇUˇ∏ˇ„ˇÅÅ䡡ˇıˇ≈ˇ„ˇ∂¢ˇÓˇÅ»ˇˇU"ˇ∏ˇ˛ˇÁˇ∏ˇˇ¢ˇˇ∞≥ˇ’ˇˇ$ˇıˇ≈ˇ„ˇ∏ˇ†ˇˇƒØˇ◊ˇˇˇ∏ˇ„ˇπˇûˇ¥≠ˇÿˇˇ˚$ˇıˇƒ„ˇ∏ˇûˇÒˇΔ¸ˇµ¸ˇŸˇˇ˛?ˇÅ–ˇÛ˛ˇÚˇˇ˛ˇˇ˜ˇˇ˜¸ˇ˛ˇˇ¯ˇˇˇµ˛ˇ˛∑ˇ˛˛ˇŸˇˇUJˇıˇÅ›ˇÙˇˇˇÓˇˇ˜ˇˇ˜ˇˇˇˇÙˇˇˇÒˇ«˝ˇˇˇ∑ˇˇ˝ˇ⁄ˇˇ^ˇÅ–ˇÙˇˇ¸ˇˇˇˇˇˇˇˇ˝ˇ˛˛ˇ˛¸ˇ˙    ˇˇˇˇˇˇ˛˛ˇ˛ˇˇˇˇÙˇ∂˛ˇˇµˇ˛ˇ⁄ˇˇUmˇıˇÅ›ˇÙ˛ˇ˝
  3045. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇÛˇÒˇ«˛ˇˇ≥ˇ˛ˇ⁄ˇˇU]ˇÅ–ˇÛ˛ˇ˛
  3046. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚ ˇˇˇˇˇˇ˛ˇ˝˝ˇÚˇ∂˛ˇˇ≥ˇ˛ˇ⁄ˇˇUxˇıˇÅ›ˇÚ˛ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚    ˇˇˇˇˇˇ˛˛ˇ˛˛ˇÒˇÒˇ«˛ˇˇÓˇˇÓˇˇˆˇˇˇˇÓˇ˛ˇ⁄ˇˇéˇΔˇ¸ˇıˇ˙ˇıˇ˙ˇ˛ˇ˛ˇƒˇÒˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚    ˇˇˇˇˇˇ˝˛ˇ˝ˇÚˇ∂˛ˇˇÓˇˇÓˇˇˆˇˇˇˇÓˇ˛ˇ⁄ˇˇU´ˇıˇ”ˇˇ˛ˇˇÌˇıˇ˙ˇ˛ˇˇˇ≈ˇÙˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇÛˇÒˇ«˛ˇˇÓˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇÓˇ˛ˇ⁄ˇˇ˛∏ˇΔ
  3047. ˇˇˇˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇ˛˛ˇ˛ˇ¸ˇ˛ˇˇ˛ˇΔˇÛ˛ˇ˛˘ˇ˝ˇˇ˝ˇˇ˛˛ˇ˛ˇˇˇˇ˚¸ˇ˛ˇˇ˛˛ˇ˛ˇˇˇˇÙˇ∂˛ˇˇÓˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇ˛Çˇıˇ”ˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˝¸ˇˇ˛ˇΔˇûˇÒˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇÓˇ˛ˇ⁄ˇˇUˇΔˇ¸ˇ˛ˇˇ¸ˇˇˇˇˇˇˇˇˇˇ˝ˇ˛ˇˇ˛ˇΔˇûˇ∂˛ˇˇÓˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3048. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇáˇıˇ”ˇ¸ˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇ˝ˇ˛ˇˇˇ≈ˇûˇÒˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3049. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇUÅˇΔˇ¸ˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇˇ˝ˇ˛ˇ˛ˇ√ˇ†ˇµ˛ˇˇÓˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3050. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇUNˇıˇÅ‹ˇˇ¢ˇˇˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇÓˇ˛ˇ⁄ˇˇUˇÅÕ¢ˇ≥˛ˇˇ≥ˇ˛ˇ⁄ˇˇ"ˇıˇÅÅˡ«˛ˇˇ≥ˇ˛ˇ⁄ˇˇ˛ˇÅņ˛ˇˇ≥ˇ˛ˇ⁄ˇˇU$ˇıˇÅÅˡ«˛ˇˇµˇ˛ˇ⁄ˇˇ˝ˇÅņ˝ˇˇˇ∑ˇˇ˝ˇ⁄ˇˇ ˇıˇÅÅËˇΔ˛ˇ˛∑ˇ˛˛ˇŸˇˇˇÅÅü¸ˇµ¸ˇŸˇˇˇıˇÅÅˡ≈≠ˇÿˇˇUˇÅÅùØˇ◊ˇˇ@,ˇıˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ¬≥ˇ’ˇˇ˛ˇÅÅÅ≠˙ˇ¸ˇˇ˛ˇÅÅÅ≠ˇ¸ˇ¸ˇˇˇÅÅÅ≠ˇ¸¸ˇˇˇˇÅÅÅ≠ˇ¸ˇ˛ˇˇˇˇÅÅÅ≠ˇ¸ˇ˛ˇˇˇ˝ˇÅÅÅ≠ˇ¸ˇ˛ˇˇˇ˚ˇÅÅÅ≠˙ˇ˛ˇˇˇUˇÅÅÅ´ˇ˙ˇˇˇ˛ˇÅÅÅ´ˇ˙ˇˇˇUˇÅÅÅ´ˇ˙ˇˇˇˇÅÅÅ´¯ˇˇˇˇÅÅۡˇ
  3051. ŎŎŎûˇU ŎŎŎüˇòʼn"OG
  3052. 2HH∞Ä lġˇˇˇˇˇˇˇˇˇˇÃÃˇˇˇˇôôˇˇˇˇffˇˇˇˇ33ˇˇˇˇˇˇÃÃˇˇˇˇÃÃÃÃˇˇÃÃôôˇˇÃÃffˇˇÃÃ33ˇˇÃÃˇˇôôˇˇˇˇôôÃÃˇˇôôôôˇˇôôffˇˇôô33ˇˇôôˇˇffˇˇˇˇffÃÃˇˇffôôˇˇffffˇˇff33ˇˇffˇˇ33ˇˇˇˇ33ÃÃˇˇ33ôôˇˇ33ffˇˇ3333ˇˇ33ˇˇˇˇˇˇÃÃˇˇôôˇˇffˇˇ33ˇˇÃÃˇˇˇˇÃÃˇˇÃÃÃÃˇˇôôÃÃˇˇffÃÃˇˇ33ÃÃˇˇÃÃÃÃˇˇÃÃÃÃÃÃÃÃÃÃôôÃÃÃÃffÃÃÃÃ33ÃÃÃÃÃÃôôˇˇÃÃôôÃÃÃÃôôôôÃÃôôffÃÃôô33ÃÃôôÃÃffˇˇÃÃffÃÃÃÃffôôÃÃffffÃÃff33ÃÃffÃÃ33ˇˇÃÃ33ÃÃÃÃ33ôôÃÃ33ffÃÃ3333ÃÃ33ÃÃˇˇÃÃÃÃÃÃôôÃÃffÃÃ33ÃÃôôˇˇˇˇôôˇˇÃÃôôˇˇôôôôˇˇffôôˇˇ33ôôˇˇôôÃÃˇˇôôÃÃÃÃôôÃÃôôôôÃÃffôôÃÃ33ôôÃÃôôôôˇˇôôôôÃÃôôôôôôôôôôffôôôô33ôôôôôôffˇˇôôffÃÃôôffôôôôffffôôff33ôôffôô33ˇˇôô33ÃÃôô33ôôôô33ffôô3333ôô33ôôˇˇôôÃÃôôôôôôffôô33ôôffˇˇˇˇffˇˇÃÃffˇˇôôffˇˇffffˇˇ33ffˇˇffÃÃˇˇffÃÃÃÃffÃÃôôffÃÃffffÃÃ33ffÃÃffôôˇˇffôôÃÃffôôôôffôôffffôô33ffôôffffˇˇffffÃÃffffôôffffffffff33ffffff33ˇˇff33ÃÃff33ôôff33ffff3333ff33ffˇˇffÃÃffôôffffff33ff33ˇˇˇˇ33ˇˇÃÃ33ˇˇôô33ˇˇff33ˇˇ3333ˇˇ33ÃÃˇˇ33ÃÃÃÃ33ÃÃôô33ÃÃff33ÃÃ3333ÃÃ33ôôˇˇ33ôôÃÃ33ôôôô33ôôff33ôô3333ôô33ffˇˇ33ffÃÃ33ffôô33ffff33ff3333ff3333ˇˇ3333ÃÃ3333ôô3333ff333333333333ˇˇ33ÃÃ33ôô33ff333333ˇˇˇˇˇˇÃÃˇˇôôˇˇffˇˇ33ˇˇÃÃˇˇÃÃÃÃÃÃôôÃÃffÃÃ33ÃÃôôˇˇôôÃÃôôôôôôffôô33ôôffˇˇffÃÃffôôffffff33ff33ˇˇ33ÃÃ33ôô33ff333333ˇˇÃÃôôff33ÓÓ››ªª™™ààwwUUDD""ÓÓ››ªª™™ààwwUUDD""ÓÓ››ªª™™ààwwUUDD""ÓÓÓÓÓÓ››››››ªªªªªª™™™™™™ààààààwwwwwwUUUUUUDDDDDD"""""""OG
  3053. 2íÙ  ŎŎŎüˇùˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇ˝ˇÅˇøˇßŎ“ˇˆˇ˚ˇˇˇAˇÅ∂ˇˇÓˇˇˆˇˇˇˇ˚¸ˇ¸ˇ˛ˇˇˇˇ¸ˇÅ…ˇ¸ˇ˛ˇ˘ˇˇUQˇÅˇøˇ˘ˇˇÓˇˇˆˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¸ˇ˛ˇ˚ˇˇˇUTˇÅ∂ˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇÅ ˇ¸ˇ˛ˇ˘ˇˇiˇÅˇøˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¸ˇ˛ˇ˚ˇˇˇùVˇÅ∂ˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇ˚˝ˇ˛ˇˇˇˇ˚ˇˇˇˇˇÅ ˇ¸ˇ˛ˇ˘ˇˇcˇÅˇøˇ˘ˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3054. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇ˙ˇ˛ˇ˚ˇˇˇZˇÅ∂ˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3055. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇÅ ˇ¯ˇ˘ˇˇeˇÅˇøˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3056. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇ˙Ŏ“ˇˇ¯ˇ˚ˇˇˇNˇÅ∂ˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇ˚ˇˇ¸¸ˇ˛ˇˇˇˇ¸ˇÅ…ˇ¯ˇ˘ˇˇˇÅˇøˇßŎ“ˇˆˇ˚ˇˇˇ˚ˇÅÅۡˇˇÅÅۡˇùˇÅÅۡˇ
  3057. ŎŎŎûˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇ˚ˇÅÅۡˇùˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇˇıÅˇËˇÅÅΔˇˇUˇıˇÅ͡Åü∑ˇÚˇˇ¸ˇıˇÅÍˇÅ°ˇˇ∑ˇˇÙˇˇˇıˇÅ͡ˇÅ¢ˇµˇÙˇˇUˇıˇÅ͡ˇÅ£ˇ≥ˇıˇˇUˇıˇÅ͡ˇÅ£ˇ≥ˇıˇˇU@ˇıˇÚ¸ˇ„ˇˇÓˇˇˆˇˇˇˇƒˇˇÅ£ˇÁˇˇˇˇ˜ˇˇflˇıˇˇUEˇıˇÚˇˇ‡ˇˇÓˇˇˆˇˇˇˇ’ıˇ¸ˇˇÅ£ˇÁˇˇˇˇ˜ˇˇflˇıˇˇUiˇıˇÚˇˇ˚˝ˇ˝˛ˇ˛ˇˇˇˇ˙ˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇ‘˜ˇ˚ˇˇÅ£ˇÁˇˇˇˇ˛˝ˇ˛ˇˇ¸ˇÊˇıˇˇÑˇıˇÚˇˇ¸ˇ˛ˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇ”˘ˇ˙ˇˇÅ£ˇÁˇˇˇˇˇˇˇˇˇˇˇˇˇˇÁˇıˇˇ¸rˇıˇÚ˝ˇ˝¸ˇ˛ˇ˝ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇ“˚ˇ˘ˇˇÅ£ˇÁ˚ˇˇˇˇˇˇˇˇˇˇˇÁˇıˇˇ|ˇıˇÚˇˇ¸ˇˇˇˇ˛˛ˇ˛ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3058. ˇˇˇˇˇˇˇˇ—˝ˇ¯ˇˇÅ£ˇÁˇˇˇˇ˚ˇ ˇˇˇˇˇˇÁˇıˇˇ˝}ˇıˇÚˇˇ¸ˇˇˇˇ˝˛ˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3059. ˇˇˇˇˇˇˇˇ–ˇˇ˜ˇˇÅ£ˇÁ    ˇˇˇˇˇˇ˚    ˇˇˇˇˇˇÁˇıˇˇÄˇıˇÚˇˇ¸ˇˇˇˇˇˇˇˇˇˇˇ˙ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3060. ˇˇˇˇˇˇˇˇƒˇˇÅ£ˇÁ    ˇˇˇˇˇˇ˛ ˇˇˇˇˇˇˇÁˇıˇˇeˇıˇÚ¸ˇ˛¸ˇ˛˛ˇ˝¸ˇ˙ˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇƒˇˇÅ£ˇÁˇˇˇˇ˛˝ˇ˛ˇˇ¸ˇÊˇıˇˇ%ˇıˇÿˇˇïˇˇÅ£ˇ”ˇˇ„ˇıˇˇU)ˇıˇ‹ˇ˛ˇˇïˇˇÅ£ˇ”ˇˇ„ˇıˇˇˇıˇ€˝ˇîˇˇÅ£ˇ≥ˇıˇˇ¸ˇıˇÅ͡ˇÅ¢ˇµˇÙˇˇˇıŎÁˇÅ¢ˇˇ∑ˇˇÙˇˇˇÚÅˇÍˇÅ†∑ˇÚˇˇUˇÅÅۡˇˇÅÅۡˇ˝ˇÅÅۡˇ˚ˇÅÅۡˇˇÅÅۡˇ¸ˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇù’ˇıˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇFˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÙˇˇ¸ˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇU]ˇıˇ˙˝ˇ˛ˇˇˇˇ¯ˇˇˆˇˇÓˇˇˆˇˇˇˇ˙ˇˇfiˇˇˆˇˇÒˇˇÚˇˇˇˇÍˇˇÎ˚ˇÂ˛ˇÅ∂ˇˇZˇÓˇˇ˛ˇˇˇÙˇˇˆˇˇÓˇˇˆˇˇˇˇ˙ˇˇfiˇˇˆˇˇÒˇˇÚˇˇˇˇŒˇˇÊˇˇÅ¡ˇıˇˇ∞ˇıˇ˚ˇˇ˚ˇˇˇˇ˛˛ˇ˛ˇˇˇˇ˙ˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇ˚˝ˇ˛˝ˇ˙ˇˇˇˇ¸ˇ˝¸ˇ˛˝ˇ˛˝ˇ˛˝ˇ˙˝ˇ˛˝ˇ˙ˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˛ˇ˛ˇˇ˛˝ˇ˛¸ˇˆˇˇ˚ˇˇˇˇ˙˝ˇ˛˝ˇÅµˇˇÌˇÓˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇˇ˜ˇˇ˚ˇˇˇˇ˚ˇˇˇˇ˛ˇˇÅ¡ˇıˇˇùŸˇıˇ˚ˇˇ˚    ˇˇˇˇˇˇ¸˝ˇ¯ˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇ˛¸ˇ˛ˇˇ˛ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇ˝˛ˇ˝ˇˇˇˇˇˇˇˇˇˇ¯ˇˇ˙ˇˇˇˇ˚ˇˇˇˇ˛ˇˇÅ¥ˇˇ¸‘ˇÓˇˇ˚    ˇˇˇˇˇˇ¸˛ˇ˜ˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3061. ˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛˚ˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇ˚ˇˇˇ¸˛ˇ˛ˇˇˇˇˇˇˇˇˇˇ˘ˇˇ¯˝ˇ˙ˇˇˇˇ˛ˇˇÅ¡ˇıˇˇ⁄ˇıˇ˚ˇˇ˚    ˇˇˇˇˇˇ¸˝ˇ¯ˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3062. ˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˆˇˇ˛ˇˇˇˇ˚    ˇˇˇˇˇˇ˚ˇˇ˚˛ˇˇˇˇˇˇˇˇˇˇˇ˘ˇˇ˘ˇˇˇˇ˚ˇˇˇˇ˛ˇˇÅ¥ˇˇUÙˇÓˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˘ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3063. ˇˇˇˇˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ˇ˙ˇˇ˛ˇˇˇˇ˚ˇˇˇ˛ˇˇ˛ˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇˇˇˇ˘ˇˇ˝    ˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇÅ¡ˇıˇˇU∂ˇıˇ˙˝ˇ˛ˇˇˇˇ˛˛ˇ˛ˇˇˇˇ˙ˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇ˘ˇˇ˛˝ˇ˘¸ˇ¸ˇ˝¸ˇ˛¸ˇ˝ˇˇ˛˝ˇ¯ˇˇ˛˝ˇ˙˝ˇ¸˝ˇ˛ˇˇ¸˛ˇ˛ˇˇ˛˝ˇ˛ˇˇˇˇ˘ˇˇ˝    ˇˇˇˇˇˇ˙˝ˇ˝ˇˇÅ¥ˇˇUˇÇˇˇÅÅØˇıˇˇˇıˇèˇˇÅÅ¢ˇˇUˇÅÅÅÆˇıˇˇùˇıˇÅÅÅÆˇˇ¸ˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇ˚Hˇ„ˇ˘ˇˇˇˆˇˇÔˇˇ˜¸ˇÎˇˇˇˇÚ˛ˇÓˇˇÂ˛ˇÙ˛ˇˇˇÅèˇıˇˇùKˇıˇˇˇ˚ˇˇ„ˇˇÔˇˇ˜ˇˇ‰ˇˇÛˇˇˇÔˇˇÊˇˇˇˆˇˇ˝ˇˇÅǡˇ¸¶ˇÌ˛ˇ˙˛ˇ˝˛ˇ˛˝ˇ˝˛ˇ˛ˇˇ¸ˇ˛˝ˇ˛˝ˇ˝˛ˇ˛¸ˇ˙ˇˇ˚˝ˇ˛¯ˇ˛
  3064. ˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇ˛˛ˇ˛˝ˇ˛˝ˇ˛¯ˇ˙ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅ±ˇıˇˇÂˇıˇ˚¸ˇ˚˝ˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅ•ˇˇU‘ˇÓ¸ˇ˚ˇ¸ˇˇˇ˛¸ˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˛ˇ˝ˇˇˇˇ˚˝ˇ˝¸ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅ≤ˇıˇˇUÿˇıˇ˚¸ˇ˚ˇ˛ˇˇˇˇˇˇˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˛˛ˇ˛ˇˇˇˇ˚ˇˇ¸!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛˛ˇ˝ˇˇ˛˚ˇ ˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅ•ˇˇ˝⁄ˇÌ˛ˇ˙ˇ˛ˇ˛
  3065. ˇˇˇˇˇˇˇˇ¸    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˝˛ˇˇˇˇˇ˚ˇˇ¸!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˝˛ˇ˛ˇˇ˛ˇˇ˚    ˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅÆˇıˇˇUÊˇıˇˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ¸!ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅ•ˇˇU©ˇ„ˇ˙ˇˇ˛¸ˇ˛˛ˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛˝ˇ˝˛ˇ˛ˇˇˇˇ˚ˇˇ˚¸ˇˇˇˇˇˇˇˇˇˇˇ˛¸ˇ˙˛ˇ˝¸ˇ˛˛ˇ¸ˇˇ˛˝ˇ˛    ˇˇˇˇˇˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅ±ˇıˇˇùˇıˇÅˇˇˇˇÅÅ√ˇˇ¸$ˇÅ¯ˇ˛ˇˇÙˇ˛ˇˇÅÅ–ˇıˇˇˇıˇÑ˝ˇÚ˝ˇÅŬˇˇ˝ˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇGˇ‚˝ˇÍ¸ˇ˜ˇˇ˜ˇˇ˛ˇˇÎ¸ˇ¯ˇˇˆˇˇ˛ˇˇÍ˛ˇÙ˛ˇˇˇÅÅˇıˇˇùCˇıˇˇˇˇˇÎˇˇËˇˇÊˇˇˇˇÏˇˇÊˇˇˇˆˇˇ˝ˇˇÅÅ„ˇˇ¶ˇÌ˛ˇ˙ˇˇˇˇ¸ˇ˛ˇˇˇˇ˚ˇˇ¸    ˇˇˇˇˇˇ˛˛ˇ˛˝ˇˇˇ¸ˇ˝¸ˇ˚ˇˇˇˇˇˇˇˇˇˇ¸ˇ˛˝ˇˇˇ¸ˇ˝¸ˇ˚ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅíˇıˇˇÀˇıˇ˚¸ˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇ˛    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅܡˇºˇÓ¸ˇ˚˚ˇˇˇˇˇˇˇˇˇ˚˝ˇ˛ ˇˇˇˇˇˇ˛ˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚¸ˇ˛ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅìˇıˇˇºˇıˇ˚¸ˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ˚˝ˇ˛ˇˇ˛˛ˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅܡˇ¡ˇÌ˛ˇ˙ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ¸    ˇˇˇˇˇˇ˝˛ˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅèˇıˇˇU«ˇıˇˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇ¸ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅܡˇúˇ„
  3066. ˇˇˇˇˇˇˇˇ˛¸ˇ˚¸ˇ ˇˇˇˇˇˇ˛˛ˇ¸
  3067. ˇˇˇˇˇˇˇˇ˛¸ˇ˚ˇˇ˚ˇˇ˝    ˇˇˇˇˇˇ˝
  3068. ˇˇˇˇˇˇˇˇ˛¸ˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅíˇıˇˇùˇıˇ‹ˇˇÀˇˇÀˇˇÅÅ≈ˇˇ+ˇ”ˇ˛ˇˇœˇ˛ˇˇœˇ˛ˇˇÅÅ“ˇıˇˇˇıˇfl˝ˇÕ˝ˇÕ˝ˇÅѡˇˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇ˚ˇıˇÅÅÅÆˇˇ8ˇ„¸ˇ˛ˇˇ˛ˇˇÓ˚ˇ¯ˇˇˇˇˆ˛ˇÙ˛ˇˇˇÅÅ•ˇıˇˇù?ˇıˇˇˇ˚ˇˇ˛ˇˇÏˇˇˆˇˇˇˇ˜ˇˇˇˆˇˇ˝ˇˇÅÅòˇˇrˇÌ˛ˇ˙ˇˇ¸˝ˇ¸ˇ˝˝ˇ˛ˇˇˇˇˇˇ˝˝ˇ˛    ˇˇˇˇˇˇ˚ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅÅ«ˇıˇˇÖˇıˇ˚¸ˇ˚ˇˇ˚ˇˇ˛ˇˇˇˇˇˇˇˇ˛ˇ˝ˇˇ˛ˇ˛ ˇˇˇˇˇˇˇˇ˙˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅŪˇˇUzˇÓ¸ˇ˚˝ˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ¸ˇˇ˝¸ˇˇˇ˝ˇ¯˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅÅ»ˇıˇˇzˇıˇ˚¸ˇ˚ˇˇ˚ˇˇ˛ˇˇˇˇ˚ˇˇˇ¸ˇˇ˛ ˇˇˇˇˇˇ˛ˇˆ˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅŪˇˇU{ˇÌ˛ˇ˙ˇˇ˚ˇˇ˛    ˇˇˇˇˇˇ˚ˇˇ¸ˇˇ˛ ˇˇˇˇˇˇ˝ˇˆ    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅѡıˇˇÑˇıˇˇˇ˚ˇˇ˛    ˇˇˇˇˇˇ˛ˇˇˇ¸ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˙ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅŪˇˇ˚cˇ„¸ˇ˝    ˇˇˇˇˇˇ˛˝ˇ˛ˇˇ¸ˇˇ˝¸ˇ ˇˇˇˇˇˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅÅ«ˇıˇˇùˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇU8ˇ„¸ˇˇˇˇˇÚ˛ˇ˛ˇˇÌˇˇÍ˛ˇÙ˛ˇˇˇÅÅ¥ˇıˇˇ¸8ˇıˇˇˇ¯ˇˇÛˇˇˇˇˇ’ˇˇˇˆˇˇ˝ˇˇÅÅߡˇuˇÌ˛ˇ˙ˇˇ¸ˇˇˇˇ˛˝ˇ˙ˇˇ¸¸ˇ˝˝ˇ˛    ˇˇˇˇˇˇ¸ˇ˝¸ˇ˚ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅÅ÷ˇıˇˇ˝ëˇıˇ˚¸ˇ˚ˇˇ¸
  3069. ˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅÅ ˇˇäˇÓ¸ˇ˚˝ˇ˛
  3070. ˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅÅ◊ˇıˇˇàˇıˇ˚¸ˇ˚ˇˇ¸ˇˇˇˇ˚ˇ˘˛ˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅÅ ˇˇâˇÌ˛ˇ˙ˇˇ¸    ˇˇˇˇˇˇÙˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ¯    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅÅ”ˇıˇˇUìˇıˇˇˇ¸    ˇˇˇˇˇˇ˛ˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅÅ ˇˇlˇ„ˇˇ¸ˇˇˇˇ˛˝ˇ˘˛ˇ˛ˇˇˇˇ˛¸ˇˇˇ˝    ˇˇˇˇˇˇ˛¸ˇ˙˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅÅ÷ˇıˇˇ¸ˇıˇ®ˇˇÅÅ⡡ˇüˇ˛ˇˇÅÅñˇıˇˇˇıˇ´˝ˇÅÅàˇˇUˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇ˝ˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇ*ˇ‚˝ˇ˝ˇˇ˙¸ˇ„˛ˇÙ˛ˇˇˇÅÅòˇıˇˇ¸5ˇıˇˇˇˇˇ˛ˇˇ˙ˇˇ·ˇˇˇˆˇˇ˝ˇˇÅÅãˇˇaˇÌ˛ˇ˙ˇˇˇˇ˝ˇ˚ˇˇ˚˝ˇ˝˛ˇ˝˝ˇ˙ˇˇ˚˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅÅ∫ˇıˇˇxˇıˇ˚¸ˇ˚ˇˇˇˇ˛ˇˇ˙ˇˇ¸ˇ˛ˇˇˇˇˇˇˇˇˇ˚˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅÅÆˇˇiˇÓ¸ˇ˚˚ˇ˛ˇˇ˙˝ˇ˝¸ˇ˛ˇ˝ˇˇˇˇ˙˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅŪˇıˇˇlˇıˇ˚¸ˇ˚ˇˇˇˇ˛ˇˇ˙ˇˇ¸ˇˇˇˇ˛˛ˇ˛˚ˇ˘˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅÅÆˇˇUnˇÌ˛ˇ˙ˇˇˇˇ˛ˇˇ˙ˇˇ¸ˇˇˇˇ˝˛ˇˇˇÙ    ˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅÅ∑ˇıˇˇ˚wˇıˇˇˇˇˇ˛ˇˇ˙ˇˇ¸ˇˇˇˇˇˇˇˇˇ˛ˇ˚ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇÅÅÆˇˇQˇ„ˇˇˇˇ˝ˇˇ˚¸ˇ˛¸ˇ˛˛ˇ˝˝ˇ˘˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇÅÅ∫ˇıˇˇ¸ˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇ˚(ˇ⁄ˇˇÚˇˇ˛ˇˇÿ˛ˇˇˇÅÅùˇıˇˇ¸)ˇıˇÁˇˇÚˇˇ˛ˇˇŸˇˇ˝ˇˇÅÅêˇˇcˇÌ˝ˇ˛¸ˇ˝¸ˇ˙˝ˇ˛˝ˇ¸ˇ˝˝ˇ˛ˇˇˇˇ˚˛ˇ˝˝ˇ˛˝ˇ˝ˇ ˇˇˇˇˇˇ˛˝ˇ˛ˇˇˇˇ˝ˇÅÅøˇıˇˇUàˇıˇ˚ˇ˛ˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇ˛ˇ˙ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛ˇˇˇˇÅÅ≥ˇˇ~ˇÌ¸ˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇ˛ˇˇˇˇˇˇˇˇˇˇ˘˛ˇ˝ˇˇˇˇ˛ˇˇ˝ˇˇ˛    ˇˇˇˇˇˇ˛¸ˇˇˇ˝ˇˇˇˇÅÅ¿ˇıˇˇU}ˇıˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇ˛ˇˇˇˇ˚ˇˇˇ¯˛ˇ˛ˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝˚ˇÅÅ≥ˇˇ~ˇÓˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇ˛    ˇˇˇˇˇˇ˚ˇˇ˜˛ˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇÅźˇıˇˇåˇıˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇ˚ˇˇˇˇ˛ˇˇ˛    ˇˇˇˇˇˇ˛ˇˇˇ˘ ˇˇˇˇˇˇˇ˛ˇˇ˝ˇˇ˛ˇˇˇˇˇ˛    ˇˇˇˇˇˇ˝ˇˇ˛ˇˇˇÅÅ∑ˇˇùcˇÌ¸ˇˇˇˇˇ˛¸ˇ˙˝ˇ¸    ˇˇˇˇˇˇ˛˝ˇ˛ˇˇ¯˛ˇ˝˝ˇ˝ˇˇ¸ˇˇ˘ˇ¸¸ˇˇˇ¸˝ˇ˛ˇˇÅѡıˇˇ¸ˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇùˇÅÅÅÆˇıˇˇ¸ˇıˇÅÅÅÆˇˇˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇUˇıˇÅÅÅÆˇˇUˇÅÅÅÆˇıˇˇ˚ˇıˇÅÅÅÆˇˇùˇÅÅÅÆˇıˇˇ¸ˇıˇÅÅÅÆˇˇ’ˇÙˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇFˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇıˇˇ˝ˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇùˇÅÅۡˇ¸ˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇ˝ˇÅÅۡˇˇÅÅۡˇùˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇˇÅÅۡˇ6ˇÊˇˇÛˇˇ˘˛ˇ˛ˇ˘ˇˇ˛ˇˇ˝ˇ˝ˇˇ˙ˇˇÅÅêˇˇ1ˇÊˇˇÛˇˇ¯ˇˇˇˇ˘ˇˇÎˇˇˇˇıˇˇÅÅêˇˇUYˇÊˇˇ˝ˇ˛˝ˇ˝ˇ˛ˇ˛ˇˇˇˇ˛ˇ˝ˇ˛ˇ˛ˇ˝ˇ˚ˇˇˇˇ˛ˇ˝ˇˇˇˇˇÅÅìˇˇˇıˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ¸ˇˇ¸    ˇˇˇˇˇˇ˝ˇˇˇˇ˛
  3071. ˇˇˇˇˇˇˇˇˇˇ¸ ˇˇˇˇˇˇˇˇ˝˝ˇ¸ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ0ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇÅ»ˇˇù]ˇÊ    ˇˇˇˇˇˇ˛ˇ˛ˇˇ˛˝ˇ    ˇˇˇˇ˝ˇˇˇ˛
  3072. ˇˇˇˇˇˇˇˇˇˇ¸ ˇˇˇˇˇˇ˛ˇ˛ˇÅÅ롡gˇıˇÛˇˇˇˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ˛
  3073. ˇˇˇˇˇˇˇˇˇˇ¸ˇˇˇˇ˛ˇˇ˝ˇˇ˝ˇÅÃˇÅ»ˇˇYˇÊˇˇˇˇˇˇ˝ˇ˝ˇˇ˝ˇ    ˇˇˇˇ˝ˇ˛ˇˇˇˇ˛ˇˇˇˇˇ¸˝ˇ˝ˇˇ˝ˇˇˇˇˇÅÅìˇˇUˇıˇÅÅˡ¿∑ˇ”ˇˇˇÅÅõˇˇ∑ˇˇ’ˇˇUˇıˇÅÅˡ¬ˇµˇ’ˇˇ˚ˇÅÅúˇ≥ˇ÷ˇˇˇıˇÅÅˡ√ˇ≥ˇ÷ˇˇù$ˇÅÕ¢ˇØˇÂ˝ˇˆˇˇ˛ˇˇÂˇ÷ˇˇ2ˇıˇÅ‹ˇˇ¢ˇˇˇ√ˇÊˇˇˇˇÚˇˇÂˇ÷ˇˇ3ˇÅœˇ†ˇ±ˇÊˇˇˇˇˇˇˇˇˇˇ˝ˇÊˇ÷ˇˇU<ˇıˇÅ›ˇûˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇ4ˇÅ–ˇûˇ≤ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇU\ˇıˇÅ›ˇÔˇˇˇ¸ˇÓˇ˙ˇˇˇ˛ˇˆˇÎˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇHˇÅ–ˇÓˇÊˇ¯ˇ˛ˇÙˇÍˇ≤ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇ˚nˇıˇÅ›ˇÔˇ¯ˇ˛ˇˇ¸ˇˇ˛ˇˇ˙ˇ˛ˇ˛ˇ¸ˇ¸ˇ˛ˇÔˇÒˇ√ˇÊˇˇˇˇˇˇˇˇˇˇ˛ˇˇÂˇ÷ˇˇù`ˇÅ–ˇÓˇ˙ˇ˛ˇ˛ˇ˛ˇ˛ˇ˛ˇ¯ˇ˛ˇ˛ˇ˛ˇ¸ˇ˛ˇÓˇ≤ˇÂ˝ˇ˝¸ˇˇˇ˝ˇˇÊˇ÷ˇˇYˇıˇÅ›ˇÔˇˇ˙ˇ˛ˇ˛ˇ˛ˇ˙ˇ˙ˇ˛ˇ˛ˇ˛ˇˇ¸ˇˇÌˇÒˇ√ˇ‚ˇˇ‘ˇ÷ˇˇJˇÅ–ˇÓˇ˙ˇ˛ˇˇˇ˛ˇ˙ˇ¯ˇ˛ˇ˛ˇ˛ˇˇ˛ˇˇÏˇ≤ˇ≥ˇ÷ˇˇNˇıˇÅ›ˇÔˇ¯ˇ˛ˇ˙ˇ˙ˇ˙ˇ˛ˇ˛ˇ¸ˇˇ˛ˇˇÌˇÒˇ√ˇ≥ˇ÷ˇˇJˇÅ–ˇÓˇ˙ˇ˛ˇ˙ˇ˛ˇ˛ˇ¯ˇ˛ˇ˛ˇ¸ˇ˛ˇ˛ˇÓˇ±ˇµˇ’ˇˇXˇıˇÅ›ˇÔˇˇˇ¸ˇ˛ˇˇ¸ˇˇ¸ˇ˙ˇˇˇ˛ˇ¸ˇ¸ˇ˛ˇÔˇÒˇ¬ˇˇ∑ˇˇ’ˇˇˇÅ–ˇÊˇ∫ˇØ∑ˇ”ˇˇU$ˇıˇÅ›ˇÈˇ˛ˇªˇÒˇÅ»ˇˇùˇÅ–ˇËˇˇ∫ˇÅ∑ˇˇˇıˇÅ‹ˇ†ˇˇÅ»ˇˇˇÅœˇˇ¢ˇˇÅ∂ˇˇUˇıˇÅ⁄¢ˇÓˇÅ»ˇˇUˇÅÅۡˇ˝ˇıˇƒ„ˇÅ√ˇÅ»ˇˇUˇ∏ˇ„ˇÅÅ䡡ˇıˇ≈ˇ„ˇÅƒˇÅ»ˇˇ¸ˇ∏ˇ„ˇÅÅ䡡ˇıˇ≈ˇ„ˇÅƒˇÅ»ˇˇˇ∏ˇ„ˇÅÅ䡡˝ˇıˇ≈ˇ„ˇ∂¢ˇÓˇÅ»ˇˇ"ˇ∏ˇ˛ˇÁˇ∏ˇˇ¢ˇˇ∞≥ˇ’ˇˇU$ˇıˇ≈ˇ„ˇ∏ˇ†ˇˇƒØˇ◊ˇˇUˇ∏ˇ„ˇπˇûˇ¥≠ˇÿˇˇ$ˇıˇƒ„ˇ∏ˇûˇÒˇΔ¸ˇµ¸ˇŸˇˇ¸?ˇÅ–ˇÛ˛ˇÚˇˇ˛ˇˇ˜ˇˇ˜¸ˇ˛ˇˇ¯ˇˇˇµ˛ˇ˛∑ˇ˛˛ˇŸˇˇJˇıˇÅ›ˇÙˇˇˇÓˇˇ˜ˇˇ˜ˇˇˇˇÙˇˇˇÒˇ«˝ˇˇˇ∑ˇˇ˝ˇ⁄ˇˇU^ˇÅ–ˇÙˇˇ¸ˇˇˇˇˇˇˇˇ˝ˇ˛˛ˇ˛¸ˇ˙    ˇˇˇˇˇˇ˛˛ˇ˛ˇˇˇˇÙˇ∂˛ˇˇµˇ˛ˇ⁄ˇˇmˇıˇÅ›ˇÙ˛ˇ˝
  3074. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇÛˇÒˇ«˛ˇˇ≥ˇ˛ˇ⁄ˇˇU]ˇÅ–ˇÛ˛ˇ˛
  3075. ˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚ ˇˇˇˇˇˇ˛ˇ˝˝ˇÚˇ∂˛ˇˇ≥ˇ˛ˇ⁄ˇˇxˇıˇÅ›ˇÚ˛ˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚    ˇˇˇˇˇˇ˛˛ˇ˛˛ˇÒˇÒˇ«˛ˇˇÓˇˇÓˇˇˆˇˇˇˇÓˇ˛ˇ⁄ˇˇ˚éˇΔˇ¸ˇıˇ˙ˇıˇ˙ˇ˛ˇ˛ˇƒˇÒˇˇˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ¸ˇˇˇˇ˚    ˇˇˇˇˇˇ˝˛ˇ˝ˇÚˇ∂˛ˇˇÓˇˇÓˇˇˆˇˇˇˇÓˇ˛ˇ⁄ˇˇ´ˇıˇ”ˇˇ˛ˇˇÌˇıˇ˙ˇ˛ˇˇˇ≈ˇÙˇˇˇˇˇˇˇˇ˛ˇˇ˛ˇˇ˛ ˇˇˇˇˇˇˇ˚ˇˇˇˇˇˇˇˇˇˇˇˇˇÛˇÒˇ«˛ˇˇÓˇˇ˛¸ˇ˝˛ˇ˛˝ˇ˛˝ˇ˛ˇˇˇˇÓˇ˛ˇ⁄ˇˇ¸∏ˇΔ
  3076. ˇˇˇˇˇˇ˛ˇˇˇˇ˛ˇ˛ˇˇˇ˛˛ˇ˛ˇ¸ˇ˛ˇˇ˛ˇΔˇÛ˛ˇ˛˘ˇ˝ˇˇ˝ˇˇ˛˛ˇ˛ˇˇˇˇ˚¸ˇ˛ˇˇ˛˛ˇ˛ˇˇˇˇÙˇ∂˛ˇˇÓˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛ˇ˛    ˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇÇˇıˇ”ˇˇˇ˝ˇˇˇˇˇˇˇˇˇˇ˝ˇˇ˝¸ˇˇ˛ˇΔˇûˇÒˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˛ˇ¸ˇˇ˝¸ˇˇˇˇˇÓˇ˛ˇ⁄ˇˇUˇΔˇ¸ˇ˛ˇˇ¸ˇˇˇˇˇˇˇˇˇˇ˝ˇ˛ˇˇ˛ˇΔˇûˇ∂˛ˇˇÓˇˇ˛ˇˇˇˇ˛˛ˇ˝ˇˇ˛
  3077. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇáˇıˇ”ˇ¸ˇˇˇˇˇˇˇˇˇˇˇ˝ˇˇˇ˝ˇ˛ˇˇˇ≈ˇûˇÒˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˝˛ˇ˛ˇˇ˛
  3078. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇÅˇΔˇ¸ˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇˇ˛ˇˇˇ˝ˇ˛ˇ˛ˇ√ˇ†ˇµ˛ˇˇÓˇˇ˛ ˇˇˇˇˇˇˇ˛ˇˇ˛
  3079. ˇˇˇˇˇˇˇˇÓˇ˛ˇ⁄ˇˇNˇıˇÅ‹ˇˇ¢ˇˇˇ«˛ˇˇÓˇˇ˛ˇˇˇˇ˛˛ˇ¸ˇˇ˛¸ˇˇˇˇˇÓˇ˛ˇ⁄ˇˇˇÅÕ¢ˇ≥˛ˇˇ≥ˇ˛ˇ⁄ˇˇ˚"ˇıˇÅÅˡ«˛ˇˇ≥ˇ˛ˇ⁄ˇˇ¸ˇÅņ˛ˇˇ≥ˇ˛ˇ⁄ˇˇ$ˇıˇÅÅˡ«˛ˇˇµˇ˛ˇ⁄ˇˇˇÅņ˝ˇˇˇ∑ˇˇ˝ˇ⁄ˇˇU ˇıˇÅÅËˇΔ˛ˇ˛∑ˇ˛˛ˇŸˇˇˇÅÅü¸ˇµ¸ˇŸˇˇUˇıˇÅÅˡ≈≠ˇÿˇˇˇÅÅùØˇ◊ˇˇU,ˇıˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ¬≥ˇ’ˇˇ¸ˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇUˇÅÅۡˇùˇÅÅۡˇ¸ˇÅÅۡˇˇÅÅۡˇ˝ˇÅÅۡˇUˇÅÅۡˇ
  3080. ŎŎŎûˇ ŎŎŎüˇU†É
  3081. d
  3082. .°dONLNdÁè~ût(ö~'Script Resources for Describing Actions"°∂ ù|ù0°∂°∂
  3083. °dONLNd¢~Æ#*aInstaller rules specify the actions to be performed by selecting a set of packages (resource type,
  3084. Courier°dONLNdqÆ~∫¢* 'inpk'°dONLNdwÆ¢∫-)$X).  Packages have names, associated comment resources, and a list that references atoms.°dONLNd—∫~Δ((√~aAtoms are script resources that describe a specific action to be performed during an installation°dONLNd3Δ~“a* 5or removal, such as copy a file or delete a resource.°dONLNdi⁄~Ê*TIn addition to atoms, packages may also reference other packages called subpackages.°dONLNdøÊ~ÚÙ* PSubpackages are identical to packages and have two main purposes: to provide the°dONLNdÚ~˛ˆ* Shierarchical list shown in the Custom Install dialog and to make scripting simpler.°dONLNdd~$*aIn the hierarchy of Installer script resources, atoms are at the lowest level.  Atoms come in six°dONLNdΔ~* Vflavors:  File Atoms, Resource Atoms, Font Atoms, ResMerge Atoms, Folder Atoms, Action°dONLNd~*Ü* 8Atoms, Audit Atoms and Boot Block Atoms (resource types °dONLNdUÜ*™('Ü'infa'°dONLNd[™*Ø)$, °dONLNd]Ø*”)'inra'°dONLNdc”*ÿ)$, °dONLNdeÿ*)'inff’,°dONLNdm*~6¢(3~‘inrm'°dONLNds*¢6ß)$, °dONLNdu*ß6À)‘infm'°dONLNd{*À6–)$, °dONLNd}*–6Ù)'inaa'°dONLNdÉ*Ù6˘)$, °dONLNdÖ*˘6)'inat'°dONLNdã*65)$, and °dONLNdë*56Y)'inbb'°dONLNdó*Y6)$), respectively).  Note that atoms are not°dONLNd¡6~B
  3085. (?~Yvisible to the user of the Installer program.  All atoms are contained within packages or°dONLNdB~Nπ* subpackages.ˇ#ƒdˇ ˇˇˇˇd
  3086. d, Palatino
  3087. .+~*C  H  A  P  T  E  R      1,     Helvetica
  3088.     *Scripting Overview(Ú~Installer 4.0.3 Technical Guide(ÚÉ )°8°ddPro†Ç
  3089. Q~-
  3090. "Wfi    Ä1®ü…    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1õü™    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3091. ú®©“,Times.ˇ‹è‹è†°dONLNdˇˇ(•´    File Atom†ô†ó†ú
  3092. Q~-
  3093. 1õü™©8†õ°ñ †ò°ddPro$
  3094. ¨°π∏°dONLNdˇˇ(µ§'infa'†ô†ó†ú
  3095. Q~-
  3096.     Ä1⁄ü˚    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1Ãü€    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3097. Œ®€Ê†°dONLNdˇˇ+"
  3098. Resource Atom†ô†ó†ú
  3099. Q~-
  3100. 1Ãü€©8†õ°ñ †ò°ddPro$
  3101. ›°Íπ°dONLNdˇˇ(ʧ'inra'†ô†ó†ú
  3102. Q~-
  3103.     Ä1 ü,    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1˛ü
  3104.     ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3105. ˇ® ’†°dONLNdˇˇ+"    Font Atom†ô†ó†ú
  3106. Q~-
  3107. 1˛ü
  3108. ©8†õ°ñ †ò°ddPro$
  3109. °∂°dONLNdˇˇ(§'inff'†ô†ó†ú
  3110. Q~-
  3111.     Ä1nüè    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1aüp    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3112. b®oȆ°dONLNdˇˇ+S
  3113. ResMerge Atom†ô†ó†ú
  3114. Q~-
  3115. 1aüp©8†õ°ñ †ò°ddPro$
  3116. r°ª°dONLNdˇˇ({§'inrm'†ô†ó†ú
  3117. Q~-
  3118.     Ä1 ü-    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1˛ü
  3119.     ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3120. ®
  3121. ›†°dONLNdˇˇ+é Action Atom†ô†ó†ú
  3122. Q~-
  3123. 1˛ü
  3124. ©8†õ°ñ †ò°ddPro$
  3125. °ª°dONLNdˇˇ(§'inaa'†ô†ó†ú
  3126. Q~-
  3127.     Ä1†ü¡    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1íü°    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3128. î®°Ó†°dONLNdˇˇ(ù´Boot Block Atom†ô†ó†ú
  3129. Q~-
  3130. 1íü°©8†õ°ñ †ò°ddPro$
  3131. £°∞ª°dONLNdˇˇ(¨§'inbb'†ô†ó†ú
  3132. Q~-
  3133.     Ä1÷ü˜    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1»ü◊    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3134.  ®◊Ÿ†°dONLNdˇˇ+'
  3135. Audit Atom†ô†ó†ú
  3136. Q~-
  3137. 1»ü◊©8†õ°ñ †ò°ddPro$
  3138. Ÿ°Ê∏°dONLNdˇˇ(‚§'inat'†ô†ó†ú
  3139. Q~-
  3140.     Ä1`˛Åt    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1S˛bt    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3141. Ta*ц°dONLNdˇˇ(]    Package†ô†ó†ú
  3142. Q~-
  3143. 1S˛b8†õ°ñ †ò°ddPro$
  3144. dˇq°dONLNdˇˇ(m'inpk'†ô†ó†ú
  3145. Q~-
  3146.     Ä1nóè
  3147.     ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1`óo
  3148.     ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3149. büoÈц°dONLNdˇˇ(k¢Package Comment†ô†ó†ú
  3150. Q~-
  3151. 1`óo°8†õ°ñ †ò°ddPro$
  3152. qò~≤°dONLNdˇˇ(zõ'icmt'†ô†ó†ú
  3153. Q~-
  3154.     Ä1≤|”Ú    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1§|≥Ú    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3155. ¶Ñ≥…ц°dONLNdˇˇ(ØáSearch Procedure†ô†ó†ú
  3156. Q~-
  3157. 1§|≥Ü8†õ°ñ †ò°ddPro$
  3158. µ}¬ó°dONLNdˇˇ(æÄ'insp'†ô†ó†ú
  3159. Q~-
  3160.     Ä1®A…∑    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1õA™∑    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3161. úJ©è†°dONLNdˇˇ(•MVersion Compare†ô†ó†ú
  3162. Q~-
  3163. 1õA™K8†õ°ñ †ò°ddPro$
  3164. ¨Cπ\°dONLNdˇˇ(µF'invc'†ô†ó†ú
  3165. Q~-
  3166.     Ä1„XŒ    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1’X‰Œ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3167. ◊`‰ùц°dONLNdˇˇ++
  3168. Atom Extender†ô†ó†ú
  3169. Q~-
  3170. 1’X‰b8†õ°ñ †ò°ddPro$
  3171. ÊYÛs°dONLNdˇˇ(Ô\'inex'†ô†ó†ú
  3172. Q~-
  3173.     Ä1Fjg‡    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    18jG‡    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3174. :rG”ц°dONLNdˇˇ+TSource File Specification†ô†ó†ú
  3175. Q~-
  3176. 18jGt8†õ°ñ †ò°ddPro$
  3177. IkVǰdONLNdˇˇ(Rn'infs'†ô†ó†ú
  3178. Q~-
  3179.     Ä1wjò‡    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1jjy‡    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3180. krx—ц°dONLNdˇˇ+"Target File Specification†ô†ó†ú
  3181. Q~-
  3182. 1jjyt8†õ°ñ †ò°ddPro$
  3183. {kàİdONLNdˇˇ(Ñn'intf'†ô†ó†úˇˇˇˇˇˇ
  3184. Q~-
  3185.     1∂X≈≥    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3186. ∑`ƒ∂ц°dONLNdˇˇ(¿c
  3187. Code Resource†ô†ó†ú
  3188. Q~-
  3189.     ™U™U™U™U1∂X≈`    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1nˇ…    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3190. ÚwˇÃ†°dONLNdˇˇ+;
  3191. Code Resource†ô†ó†ú
  3192. Q~-
  3193.     ™U™U™U™U1nˇv    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1øíŒÌ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3194. ¡õŒ†°dONLNdˇˇ+$œ
  3195. Code Resource†ô†ó†ú
  3196. Q~-
  3197.     ™U™U™U™U1øíŒö    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1∂(    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3198. æ(ц°dONLNdˇˇ($¡
  3199. Code Resource†ô†ó†ú
  3200. Q~-
  3201.     ™U™U™U™U1∂(æ    ˇˇˇˇˇˇˇˇ8°d
  3202. dPro    †åqö°§ß§§ö°ö§öß§§"ó§†ç°ddPro
  3203. °d
  3204. dPro    †åqTÙZ˛W˛ZÙWÙTÙW˛"Wfi†ç°ddPro
  3205. "efi °d
  3206. dPro    †åqoçuóróuçrçoçró"rs†ç°ddPro
  3207. °d
  3208. dPro    †åq.b8j8j1b0d.f8j"∂Pz†ç°ddPro
  3209.  {Äİd
  3210. dPro    †åqúï¢üüü¢ïüïúïüü"üĆç°ddPro
  3211. °d
  3212. dPro    †åqŒï”ü—ü”ï—ïŒï—ü"—Ćç°ddPro
  3213. "{˛Ç°d
  3214. dPro    †åqˇïüüïïˇïü"Ćç°ddPro
  3215. °d
  3216. dPro    †åqbïhüeühïeïbïeü"eĆç°ddPro
  3217. °d
  3218. dPro    †åqŒï‘ü—ü‘ï—ïŒï—ü"—Ćç°ddPro
  3219. °d
  3220. dPro    †åqòïûüõüûïõïòïõü"õĆç°ddPro
  3221. °d
  3222. dPro    †åq1ï6ü4ü6ï4ï1ï4ü"4Ćç°ddPro
  3223. °d
  3224. dPro    †åq_cjjjjbc`e_hjj ∂`e†ç°ddPro
  3225. °d
  3226. dPro    †åqü7¶AüA¶9£8°7üA"∂$̆ç°ddPro
  3227. °d
  3228. dPro    †åqÿMfiX⁄XfiN€NÿM⁄X"„:¯†ç°ddPro
  3229. °d
  3230. dPro    †åq§9≠A§A≠>¨;™9§A"„'…†ç°ddPro
  3231. °d
  3232. dPro    †åqfiNÁXfiXÁRÂP‚NfiX"<Æç°ddPro
  3233. °d
  3234. dPro    †åqŒM’X’X”M—NŒP’X"∂:†ç°ddPro
  3235. °d
  3236. dPro    †åq3`=j=j7`5c3e=j"„OR†ç°ddPro
  3237. °d
  3238. dPro    †åqdbnjnjgbeddgnj „ed†ç°ddPro
  3239. °d
  3240. dPro    †åq:_AjAj?_=`:bAj"L$†ç°ddPro
  3241. °d
  3242. dPro    †åqu_zjwjz`x`u_wj"|L¸†ç°ddPro
  3243. °d
  3244. dPro    †åq|`Ñj|jÑcÅa`|j"∂MÀ†ç°ddPro
  3245. °d
  3246. dPro    †åqÄaäjÄjäfàcÜaÄj"ÏOú†ç°ddPro
  3247. °d
  3248. dPro    †åqJ_RjJjRbOaL_Jj"|M”†ç°ddPro
  3249. °d
  3250. dPro    †åqk_sjsjp_nakbsj"FM(†ç°ddPro
  3251. °d
  3252. dPro    †åqC`HjFjH`F`C`Fj"FL†ç°ddPro
  3253.     Ä1=ü^    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1/ü>    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3254. 1®>‹†°dONLNdˇˇ(:´ Folder Atom†ô†ó†ú
  3255. Q~-
  3256. 1/ü>©8†õ°ñ †ò°ddPro$
  3257. @°Mª°dONLNdˇˇ(I§'infm'†ô†ó†ú°d
  3258. dPro    †å
  3259. Q~-
  3260. qï
  3261. üü
  3262. ïïïü"Ćç°ddPro
  3263. †É
  3264. d
  3265. .°dONLNdA~P<(L~Independent Script Resources"°∂ O|O0°∂°∂
  3266. °dONLNdT~`.*aSeven independent script resources can optionally be added to the script to control miscellaneous°dONLNdÄ`~l#* &Installer actions and interface parts.ˇ5ˆdˇ ˇˇˇˇd
  3267. d, Palatino
  3268. .+~*C  H  A  P  T  E  R      1,     Helvetica
  3269.     *Scripting Overview(Ú~Installer 4.0.3 Technical Guide(ÚÉ )°9°ddPro†Ç
  3270. Q~‰˚    Ä1`Äň    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1SÄbˆ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3271. Tàaÿ,Times.ˇì}ì}ц°dONLNdVã_ê(]ãSܰdONLNdˇˇ)cц°dONLNdˇˇ)rɇ°dONLNdˇˇ)i°dONLNdˇˇ)pѰdONLNdˇˇ)t °dONLNdˇˇ) D °dONLNdˇˇ)CD‡°dONLNdˇˇ)rD °dONLNdˇˇ)eB¿°dONLNdˇˇ)aA`°dONLNdˇˇ)t¡Ä°dONLNdˇˇ)iA†°dONLNdˇˇ)o¡†°dONLNdˇˇ)nA†°dONLNdˇˇ) ņ°dONLNdˇˇ)DİdONLNdˇˇ)a °dONLNdˇˇ)tÄ@°dONLNdˇˇ)e†ô†ó†ú
  3272. Q~‰˚1SÄbä8†õ°ñ †ò°ddPro$
  3273. dÅqõ°dONLNdˇˇ(mÑ'7‡°dONLNdˇˇ)i7¿°dONLNdˇˇ)n9 °dONLNdˇˇ)cπ °dONLNdˇˇ)d∫İdONLNdˇˇ)'†ô†ó†ú
  3274. Q~‰˚    Ä1íÄ≥ˆ    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1ÑÄ술   ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3275. Üàì∂ц°dONLNdˇˇ(èãDİdONLNdˇˇ)iц°dONLNdˇˇ)s@°dONLNdˇˇ)kÖ@°dONLNdˇˇ) ≈@°dONLNdˇˇ)OE °dONLNdˇˇ)rD`°dONLNdˇˇ)dƒ`°dONLNdˇˇ)e√°dONLNdˇˇ)r†ô†ó†ú
  3276. Q~‰˚1ÑÄìä8†õ°ñ †ò°ddPro$
  3277. ïÅ¢õ°dONLNdˇˇ(ûÑ'7‡°dONLNdˇˇ)i7¿°dONLNdˇˇ)n9 °dONLNdˇˇ)d:İdONLNdˇˇ)o;‡°dONLNdˇˇ)'†ô†ó†ú
  3278. Q~‰˚    Ä1í≥x    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1Ñìx    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3279. Ü ì8†°dONLNdˇˇ(èS°dONLNdˇˇ)c†°dONLNdˇˇ)r‡°dONLNdˇˇ)iѰdONLNdˇˇ)p°dONLNdˇˇ)tÑ °dONLNdˇˇ) ƒ °dONLNdˇˇ)S≈İdONLNdˇˇ)iE†°dONLNdˇˇ)zD@°dONLNdˇˇ)e†ô†ó†ú
  3280. Q~‰˚1Ñì 8†õ°ñ †ò°ddPro$
  3281. dONLNdˇˇ(û'∑‡°dONLNdˇˇ)i∑¿°dONLNdˇˇ)nπ °dONLNdˇˇ)s9 °dONLNdˇˇ)zπ °dONLNdˇˇ)'†ô†ó†ú†õ°ñ †ò°ddPro0
  3282. É∑ì¿
  3283. °dONLNdˇˇ(é∫ †ô†ó†ú
  3284. Q~‰˚    Ä1√‰x    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1∂≈x    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3285. ∑ ƒE
  3286.     †°dONLNdˇˇ+T2S°dONLNdˇˇ)c†°dONLNdˇˇ)r‡°dONLNdˇˇ)iѰdONLNdˇˇ)p°dONLNdˇˇ)tÑ °dONLNdˇˇ) õ°dONLNdˇˇ)Vê°dONLNdˇˇ)e0°dONLNdˇˇ)rp°dONLNdˇˇ)sö°dONLNdˇˇ)i0°dONLNdˇˇ)oö0°dONLNdˇˇ)n†ô†ó†ú
  3287. Q~‰˚1∂≈ 8†õ°ñ †ò°ddPro$
  3288. «‘°dONLNdˇˇ(–'∑‡°dONLNdˇˇ)i∑¿°dONLNdˇˇ)nπ °dONLNdˇˇ)v9 °dONLNdˇˇ)sπ °dONLNdˇˇ)'†ô†ó†ú
  3289. Q~‰˚    Ä1`Åx    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1Sbx    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3290. T aC†°dONLNdˇˇ(]S°dONLNdˇˇ)pܰdONLNdˇˇ)l °dONLNdˇˇ)a¿°dONLNdˇˇ)sÖ`°dONLNdˇˇ)h`°dONLNdˇˇ) E`°dONLNdˇˇ)SF¿°dONLNdˇˇ)cE`°dONLNdˇˇ)rD†°dONLNdˇˇ)eC@°dONLNdˇˇ)eA‡°dONLNdˇˇ)n†ô†ó†ú
  3291. Q~‰˚1Sb 8†õ°ñ †ò°ddPro$
  3292. d{o°dONLNdˇˇ(m'∑‡°dONLNdˇˇ)P∏†°dONLNdˇˇ)I8¿°dONLNdˇˇ)C∏†°dONLNdˇˇ)T8°dONLNdˇˇ)'Ô‡°dONLNdˇˇ) p°dONLNdˇˇ)"°‡°dONLNdˇˇ)S¢†°dONLNdˇˇ)p§°dONLNdˇˇ)l£‡°dONLNdˇˇ)a•@°dONLNdˇˇ)s%@°dONLNdˇˇ)h&†°dONLNdˇˇ) ¶¿°dONLNdˇˇ)SßİdONLNdˇˇ)c'İdONLNdˇˇ)r&¿°dONLNdˇˇ)e( °dONLNdˇˇ)e)İdONLNdˇˇ)n*‡°dONLNdˇˇ)"\¿°dONLNdˇˇ) ‹‡°dONLNdˇˇ)ofi@°dONLNdˇˇ)r›Ä)
  3293. †ô†ò°ddPro$°dONLNdˇˇ(w"1‡°dONLNdˇˇ)C±¿°dONLNdˇˇ)o≥ °dONLNdˇˇ)l≥°dONLNdˇˇ)o¥`°dONLNdˇˇ)r≥†°dONLNdˇˇ) 3¿°dONLNdˇˇ)S4İdONLNdˇˇ)p5‡°dONLNdˇˇ)l5¿°dONLNdˇˇ)a7 °dONLNdˇˇ)s∑ °dONLNdˇˇ)h∏İdONLNdˇˇ) 8†°dONLNdˇˇ)S9`°dONLNdˇˇ)cπ`°dONLNdˇˇ)r∏†°dONLNdˇˇ)e∫°dONLNdˇˇ)eª`°dONLNdˇˇ)nº¿°dONLNdˇˇ)"†ô†ó†ú
  3294. Q~‰˚    Ä1íÖ≥˚    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1ÑÖì˚    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3295. ÜçìÀц°dONLNdˇˇ+4AİdONLNdˇˇ)c °dONLNdˇˇ)tÉ@°dONLNdˇˇ)i`°dONLNdˇˇ)oÉ`°dONLNdˇˇ)n`°dONLNdˇˇ) C`°dONLNdˇˇ)H√@°dONLNdˇˇ)a¡‡°dONLNdˇˇ)nA‡°dONLNdˇˇ)d¡‡°dONLNdˇˇ)lB°dONLNdˇˇ)e@†°dONLNdˇˇ)r†ô†ó†ú
  3296. Q~‰˚1ÑÖìè8†õ°ñ †ò°ddPro$
  3297. ïÜ¢†°dONLNdˇˇ(ûâ'7‡°dONLNdˇˇ)i7¿°dONLNdˇˇ)n9 °dONLNdˇˇ)a:İdONLNdˇˇ)h;‡°dONLNdˇˇ)'†ô†ó†ú
  3298. Q~‰˚    Ä1`ÖÅ˚    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1SÖb˚    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3299. TçaΩц°dONLNdˇˇ(]êPܰdONLNdˇˇ)rÖ@°dONLNdˇˇ)eɇ°dONLNdˇˇ)fÉ °dONLNdˇˇ)eÅ¿°dONLNdˇˇ)rŰdONLNdˇˇ)e†°dONLNdˇˇ)nˇ†°dONLNdˇˇ)c˛@°dONLNdˇˇ)e¸‡°dONLNdˇˇ)s†ô†ó†ú
  3300. Q~‰˚1SÖbè8†õ°ñ †ò°ddPro$
  3301. dÜqû°dONLNdˇˇ(mâ'7‡°dONLNdˇˇ)i7¿°dONLNdˇˇ)n9 °dONLNdˇˇ)p:İdONLNdˇˇ)r9¿°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3302. Q~‰˚    1nõ}ˆ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3303. o§|˘†°dONLNdˇˇ+
  3304. C`°dONLNdˇˇ)oÖ`°dONLNdˇˇ)d`°dONLNdˇˇ)e°dONLNdˇˇ) D°dONLNdˇˇ)RD¿°dONLNdˇˇ)eC`°dONLNdˇˇ)sƒ°dONLNdˇˇ)oD°dONLNdˇˇ)uƒ°dONLNdˇˇ)r√@°dONLNdˇˇ)c¡‡°dONLNdˇˇ)e†ô†ó†ú
  3305. Q~‰˚    ™U™U™U™U1nõ}£    ˇˇˇˇˇˇˇˇ8ˇˇˇˇˇˇ    1üõƈ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro$
  3306. °§Æ˘†°dONLNdˇˇ(™ßC`°dONLNdˇˇ)oÖ`°dONLNdˇˇ)d`°dONLNdˇˇ)e°dONLNdˇˇ) D°dONLNdˇˇ)RD¿°dONLNdˇˇ)eC`°dONLNdˇˇ)sƒ°dONLNdˇˇ)oD°dONLNdˇˇ)uƒ°dONLNdˇˇ)r√@°dONLNdˇˇ)c¡‡°dONLNdˇˇ)e†ô†ó†ú
  3307. Q~‰˚    ™U™U™U™U1üõÆ£    ˇˇˇˇˇˇˇˇ8†É
  3308. d
  3309. .°dONLNdˇˇ( 6Installation Timeline"°∂ 40°∂°∂
  3310. °dONLNd~!!+H\Many activities occur during an installation or removal.  Keeping the order and dependencies°dONLNdq!~-* Zstraight is a challenge.  To help you understand the specific events that happen during an°dONLNdÃ-~9q* 4installation, the seven phases are summarized below.
  3311. °dONLNdM~\¿*"    Launching"°∂ [|[0°∂°∂°ddPro†Ç
  3312. `~rçêzúöºz£öºaq厏ÄÒaaa!D<ġ†É
  3313. d
  3314. °dONLNd `ôlˆ+User opens Installer.°ddPro†Ç
  3315. bDnL1dFnL8†É
  3316. d    ™U™U™U™U"\-"\-°ddPro†Ç
  3317. v~àêê5”U˚5ŸU¯wáè
  3318.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3319. d°dONLNd&vôÇ$* Installer finds and opens script°dONLNdGÇôéΔ*     document.°ddPro†Ç
  3320. vhÇp    ˇˇˇˇˇˇˇˇ1xjÇp8†É
  3321. d    ™U™U™U™U"r-"r-°ddPro†Ç
  3322. í~§êê5”U˚5ŸU¯ì£è
  3323.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3324. d°dONLNdWíôû*Read ‘insz’ if it exists and°dONLNdtûô™* create the script’s sub-heap.°ddPro†Ç
  3325. íåûî    ˇˇˇˇˇˇˇˇ1îéûî8†É
  3326. d    ™U™U™U™U"é-"é-°ddPro†Ç
  3327. Æ~¿êê5”U˚5ŸU¯Øøè
  3328.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3329. d°dONLNdöÆô∫*Find the Splash Screen PICT.°ddPro†Ç
  3330. Æ∞∫∏    ˇˇˇˇˇˇˇˇ1∞≤∫∏8†É
  3331. d    ™U™U™U™U"™-"™-°ddPro†Ç
  3332. ƒ~÷çêzúöºz£öº≈’厏ÄÒaaa!D<ġ†É
  3333. d°dONLNd¡ƒô–*User reads and dismisses the°dONLNdfi–ô‹‹* Splash Screen.°ddPro†Ç
  3334. ƒ‘–‹    ˇˇˇˇˇˇˇˇ1Δ÷–‹8†É
  3335. d    ™U™U™U™U"¿-"¿-°ddPro†Ç
  3336. ‡~Ôèê»[‚É»`‚}·Óéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3337. d°dONLNd˘‡ôÏ*Setup Function is called, if it°dONLNdÏô¯∂* exists.°ddPro†Ç
  3338. ‡˙Ï    ˇˇˇˇˇˇˇˇ1‚¸Ï8†É
  3339. d    ™U™U™U™U"‹-"‹-°ddPro†Ç
  3340. ¸2    &":ˆ 4%"Vˆ"rˆ"éˆ"™ˆ"Δˆ"‚ˆ"˛ˆ"ˆ†É
  3341. d"¯-"¯-
  3342. °dONLNd2~(($~Installer Rule Evaluation    ˇˇˇˇˇˇˇˇ"°∂ '|'0°∂°∂°ddPro†Ç
  3343. ,~>êê5”U˚5ŸU¯-=è
  3344.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3345. d
  3346. °dONLNdM,ô8)+ Begin execution of Global Rules,°dONLNdn8ôD* then the rules for the current°dONLNdçDôP* interface mode (Easy or°dONLNd•Pô\¡* Custom).°d WORDø
  3347. ,2@Ò4.488
  3348. d    ™U™U™U™U"(-3"(-3°ddPro†Ç
  3349. `~oèê»[‚É»`‚}anéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3350. d°dONLNd±`ôl*Call code resources referenced°dONLNd–lôx* by CheckUserFunction and°dONLNdÈxôÑ'* CheckRuleFunction rule clauses°dONLNdÑôê#*  when, and if, the rule clause is°dONLNd)êôúÀ*
  3351. evaluated.°ddPro†Ç
  3352. `DlL    ˇˇˇˇˇˇˇˇ1bFlL8†É°ddPro†Ç
  3353. `hlp1bjlp8†É°ddPro†Ç
  3354. `ålî1bélî8†É°ddPro†Ç
  3355. `∞l∏1b≤l∏8†É
  3356. d    ™U™U™U™U"\-?"\-?ˇ Ddˇ ˇˇˇˇd
  3357. d, Palatino
  3358. .+~*C  H  A  P  T  E  R      1,     Helvetica
  3359.     *Scripting Overview(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú10°ddPro†Ç
  3360. U~dèê»[‚É»`‚}Vcéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3361. d
  3362. °dONLNdUôa    (^ôCall File Searching code°dONLNdaôm* resources referenced by Target°dONLNd8môy * File Specs that are referenced°dONLNdWyôÖ    * by rule clauses.  The code°dONLNdrÖôë"*  resource is called once for each°dONLNdìëôù** Target File Spec regardless how°dONLNd≥ùô©%* many rule clauses reference the°dONLNd”©ôµÊ* Target File Spec.°ddPro†Ç
  3363. Uhap1Wjap8†É°ddPro†Ç
  3364. U∞a∏1W≤a∏8†É
  3365. d    ™U™U™U™U"Q-c"Q-c°ddPro†Ç
  3366. π~Àçêzúöºz£öº∫ åˇ¸ÄÒaaa!D<ġ†É
  3367. d°dONLNdÔπô≈*User sees the Easy, Custom or°dONLNd
  3368. ≈ô—‡* Remove dialog.°ddPro†Ç
  3369. π¯≈    ˇˇˇˇˇˇˇˇ1ª˙≈8†É
  3370. d    ™U™U™U™U"µ-"µ-°ddPro†Ç
  3371. ’2‚&"·:ˆ fi4fi%"·Vˆ"·rˆ"·éˆ"·™ˆ"·Δˆ"·‚ˆ"·˛ˆ"·ˆ†É
  3372. d"—-"—-
  3373. °dONLNd-Ú~≈(˝~ Preflighting    ˇˇˇˇˇˇˇˇ"°∂ |0°∂°∂°ddPro†Ç
  3374. ~çêzúöºz£öºåˇ¸ÄÒaaa!D<ġ†É
  3375. d
  3376. °dONLNd;ô+User clicks the Install or°dONLNdVôfi* Remove button.°ddPro†Ç
  3377. 2:1    4:8†É
  3378. d    ™U™U™U™U"-"-°ddPro†Ç
  3379. !~3çêzúöºz£öº"2厏ÄÒaaa!D<ġ†É
  3380. d°dONLNdh!ô-*Preparing to install dialog°dONLNdÑ-ô9¡* appears.°d WORDÏ
  3381. !85$4#:-#    ˇˇˇˇˇˇˇˇ8
  3382. d    ™U™U™U™U"-"-°ddPro†Ç
  3383. =~Lèê»[‚É»`‚}>Kéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3384. d°dONLNdê=ôI!*Call File Search code resource°dONLNdØIôU* for all relevant Target File°dONLNdÃUôaµ* Specs.°ddPro†Ç
  3385. =DIL    ˇˇˇˇˇˇˇˇ1?FIL8†É°ddPro†Ç
  3386. =VI^1?XI^8†É
  3387. d    ™U™U™U™U"9-'"9-'°ddPro†Ç
  3388. e~wêê5”U˚5ŸU¯fvè
  3389.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3390. d°dONLNdÿeôq*Check each target file, rsrc or°dONLNd¯qô}* font to compute needed space.°d WORD°
  3391. eiq
  3392. 4gkq        ˇˇˇˇˇˇˇˇ8
  3393. d    ™U™U™U™U"a-"a-°ddPro†Ç
  3394. Å~êèê»[‚É»`‚}Çèéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3395. d°dONLNdÅôç*Call Version Compare code°dONLNd7çôô(*  resource for File Atoms and Rsrc°dONLNdXôô•Ú* Atoms as necessary.°ddPro†Ç
  3396. Ååçî    ˇˇˇˇˇˇˇˇ1Ééçî8†É°ddPro†Ç
  3397. Åûç¶1Ɇç¶8†É°ddPro†Ç
  3398. Å∞ç∏1É≤ç∏8†É°ddPro†Ç
  3399. Ŭç 1Ƀç 8†É
  3400. d    ™U™U™U™U"}-'"}-'°ddPro†Ç
  3401. ©~ªêê5”U˚5ŸU¯™∫è
  3402.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3403. d°dONLNdw©ôµ*Verify that no target files°dONLNdìµô¡* match any source files.°ddPro†Ç
  3404. ©µ$    ˇˇˇˇˇˇˇˇ1´µ$8†É
  3405. d    ™U™U™U™U"•-"•-°ddPro†Ç
  3406. ≈2“&"—:ˆ Œ4Œ%"—Vˆ"—rˆ"—éˆ"—™ˆ"—Δˆ"—‚ˆ"—˛ˆ"—ˆ†É
  3407. d"¡-"¡-
  3408. °dONLNdæ‚~Ò8(Ì~Preparation to Install/Remove    ˇˇˇˇˇˇˇˇ"°∂ |0°∂°∂°ddPro†Ç
  3409. ı~çêzúöºz£öºˆåˇ¸ÄÒaaa!D<ġ†É
  3410. d
  3411. °dONLNd›ıô#+Confirm shutting down running°dONLNd˚ô
  3412. Ú* applications if live°dONLNd
  3413. ô* installation or removal.°ddPro†Ç
  3414. ˜2:1˘4:8†É
  3415. d    ™U™U™U™U"Ò-'"Ò-'°ddPro†Ç
  3416. ~/çêzúöºz£öº.厏ÄÒaaa!D<ġ†É
  3417. d°dONLNd,ô)*Status Dialog appears.°d WORDÏ
  3418. 81$4:)#    ˇˇˇˇˇˇˇˇ8
  3419. d    ™U™U™U™U"-"-°ddPro†Ç
  3420. 5~Gêê5”U˚5ŸU¯6Fè
  3421.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3422. d°dONLNdF5ôA *Save off original files, as°dONLNdbAôM* necessary, if disk space°dONLNd{MôY *
  3423. available.°ddPro†Ç
  3424. 5DA^    ˇˇˇˇˇˇˇˇ17FA^8†É
  3425. d    ™U™U™U™U"1-'"1-'°ddPro†Ç
  3426. ]~lèê»[‚É»`‚}^kéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3427. d°dONLNdä]ôi*Send ‘Initialize’ message to°dONLNdßiôu„* Atom Extenders.°ddPro†Ç
  3428. ]ziÇ    ˇˇˇˇˇˇˇˇ1_|iÇ8†É°ddPro†Ç
  3429. ]Çiä1_Ñiä8†É°ddPro†Ç
  3430. ]äií1_åií8†É°ddPro†Ç
  3431. ]íiö1_îiö8†É°ddPro†Ç
  3432. ]öi¢1_úi¢8†É
  3433. d    ™U™U™U™U"Y-"Y-°ddPro†Ç
  3434. y~àèê»[‚É»`‚}záéè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3435. d°dONLNdæyôÖ*Call ‘before’ Action Atoms.°ddPro†Ç
  3436. y∞Ö∏    ˇˇˇˇˇˇˇˇ1{≤Ö∏8†É°ddPro†Ç
  3437. y∏Ö¿1{∫Ö¿8†É°ddPro†Ç
  3438. y¿Ö»1{¬Ö»8†É°ddPro†Ç
  3439. y»Ö–1{ Ö–8†É
  3440. d    ™U™U™U™U"u-"u-°ddPro†Ç
  3441. å~ûêê5”U˚5ŸU¯çùè
  3442.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3443. d°dONLNd‰åôò*Dispose of script sub-heap if°dONLNdòô§* extra memory is needed.°ddPro†Ç
  3444. å¯ò    ˇˇˇˇˇˇˇˇ1é˙ò8†É
  3445. d    ™U™U™U™U"à-"à-°ddPro†Ç
  3446. ®~∫êê5”U˚5ŸU¯©πè
  3447.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3448. d°dONLNd(®ô¥ *Delete old files, resources and°dONLNdH¥ô¿≤* fonts.°ddPro†Ç
  3449. ®
  3450. ¥$    ˇˇˇˇˇˇˇˇ1™ ¥$8†É
  3451. d    ™U™U™U™U"§-"§-°ddPro†Ç
  3452. ƒ2—&"–:ˆ Õ4Õ%"–Vˆ"–rˆ"–éˆ"–™ˆ"–Δˆ"–‚ˆ"–˛ˆ"–ˆ†É
  3453. d"¿-"¿-ˇ Hdˇ ˇˇˇˇd
  3454. d, Palatino
  3455. .+~*C  H  A  P  T  E  R      1,     Helvetica
  3456.     *Scripting Overview(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú11
  3457. °dONLNdQ~`¥(\~1Reading Source File, Rsrc or Font (for each atom)"°∂ _|_0°∂°∂°ddPro†Ç
  3458. d~vêê5”U˚5ŸU¯euè
  3459.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3460. d
  3461. °dONLNd3dôp‰+Open source file.°ddPro†Ç
  3462. f2r:1h4r:8†É
  3463. d    ™U™U™U™U"`-"`-°ddPro†Ç
  3464. z~åçêzúöºz£öº{ã厏ÄÒaaa!D<ġ†É
  3465. d°dONLNdHzôÜ'*User sees “Reading…” in Status°dONLNdgÜôíº* Dialog.°d WORD’
  3466. zJà4|LÜ    ˇˇˇˇˇˇˇˇ8
  3467. d    ™U™U™U™U"v-"v-°ddPro†Ç
  3468. ñ~•èê»[‚É»`‚}ó§éè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3469. d°dONLNdsñô¢*Send ‘BeforePart’ message to°dONLNdê¢ôÆfl* Atom Extender.°ddPro†Ç
  3470. ñh¢Ç    ˇˇˇˇˇˇˇˇ1òj¢Ç8†É
  3471. d    ™U™U™U™U"í-"í-°ddPro†Ç
  3472. ≤~ƒêê5”U˚5ŸU¯≥√è
  3473.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3474. d°dONLNd•≤ôæ*If the Atom Extender did not°dONLNd¬æô * read the data, the Installer°dONLNdfl ô÷&* reads as much data as possible,°dONLNdˇ÷ô‚* placing each chunk into the°dONLNd‚ôÓ* buffer list.  If not enough°dONLNd7Óô˙* memory is free to buffer the°dONLNdT˙ô"*  data, the buffer list is flushed°dONLNduô&*  and the data is written to disk.°ddPro†Ç
  3475. ≤åæ¶    ˇˇˇˇˇˇˇˇ1¥éæ¶8†É°ddPro†Ç
  3476. ≤¶æ¿1¥®æ¿8†É°ddPro†Ç
  3477. ≤¿æ⁄1¥¬æ⁄8†É°ddPro†Ç
  3478. ≤⁄æÙ1¥‹æÙ8†É°ddPro†Ç
  3479. ≤Ùæ1¥ˆæ8†É
  3480. d    ™U™U™U™U"Æ-c"Æ-c°ddPro†Ç
  3481. ~(êê5”U˚5ŸU¯'è
  3482.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3483. d°dONLNdûô"* Close source file, if necessary.°ddPro†Ç
  3484. $$    ˇˇˇˇˇˇˇˇ1$$8†É
  3485. d    ™U™U™U™U"-"-°ddPro†Ç
  3486. ,29&"8:ˆ 545%"8Vˆ"8rˆ"8éˆ"8™ˆ"8Δˆ"8‚ˆ"8˛ˆ"8ˆ†É
  3487. d"(-"(-
  3488. °dONLNd“I~X®(T~1Writing Target File, Rsrc or Font (for each atom)    ˇˇˇˇˇˇˇˇ"°∂ W|W0°∂°∂°ddPro†Ç
  3489. \~nêê5”U˚5ŸU¯]mè
  3490.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3491. d
  3492. °dONLNd\ôhÂ+Open target file.°ddPro†Ç
  3493. ^2j:1`4j:8†É
  3494. d    ™U™U™U™U"X-"X-°ddPro†Ç
  3495. r~Ñçêzúöºz£öºsÉ厏ÄÒaaa!D<ġ†É
  3496. d°dONLNdrô~&*User sees “Writing…” in Status°dONLNd9~ôäº* Dialog.°d WORD’
  3497. rJÄ4tL~    ˇˇˇˇˇˇˇˇ8
  3498. d    ™U™U™U™U"n-"n-°ddPro†Ç
  3499. é~†êê5”U˚5ŸU¯èüè
  3500.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3501. d°dONLNdEéôö'*Write buffered data into target°dONLNdeöô¶* file, rsrc or font resource.°ddPro†Ç
  3502. éVöp    ˇˇˇˇˇˇˇˇ1êXöp8†É°ddPro†Ç
  3503. épöä1êröä8†É°ddPro†Ç
  3504. éäö§1êåö§8†É°ddPro†Ç
  3505. é§öæ1ê¶öæ8†É°ddPro†Ç
  3506. éæöÿ1ê¿öÿ8†É
  3507. d    ™U™U™U™U"ä-"ä-°ddPro†Ç
  3508. ™~πèê»[‚É»`‚}´∏éè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3509. d°dONLNdá™ô∂*Send ‘AfterPart’ message to°dONLNd£∂ô¬fl* Atom Extender.°ddPro†Ç
  3510. ™Ê∂    ˇˇˇˇˇˇˇˇ1¨Ë∂8†É
  3511. d    ™U™U™U™U"¶-"¶-°ddPro†Ç
  3512. Δ~ÿêê5”U˚5ŸU¯«◊è
  3513.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3514. d°dONLNdøΔô“ * Close target file, if necessary.°ddPro†Ç
  3515. »‘$    ˇˇˇˇˇˇˇˇ1 ‘$8†É
  3516. d    ™U™U™U™U"¬-"¬-°ddPro†Ç
  3517. ‹2È&"Ë:ˆ Â4Â%"ËVˆ"Ërˆ"Ëéˆ"Ë™ˆ"ËΔˆ"Ë‚ˆ"˲ˆ"ˈ†É
  3518. d"ÿ-"ÿ-
  3519. °dONLNdÛ˘~∫(~
  3520. Finalizing    ˇˇˇˇˇˇˇˇ"°∂ |0°∂°∂°ddPro†Ç
  3521.  ~èê»[‚É»`‚}
  3522. éè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3523. d
  3524. °dONLNdˇ ô +Send ‘Success’ or ‘Cancel ‘°dONLNdô$* message to Atom Extenders.°ddPro†Ç
  3525. 2:14:8†É°ddPro†Ç
  3526. :B1<B8†É°ddPro†Ç
  3527. BJ1DJ8†É°ddPro†Ç
  3528. JR1LR8†É°ddPro†Ç
  3529. RZ1TZ8†É
  3530. d    ™U™U™U™U"-"-°ddPro†Ç
  3531. (~7èê»[‚É»`‚})6éè•Òġ¿Äû<yć0@nøÄo` _Øà(◊ÑPØÇQW¬°Ø¡°W¡!Ø¿Ä!ˇÄ?U^ÄÍ™´Ä}U^ˇ†É
  3532. d°dONLNd9(ô4&*Send ‘after’ or ‘cleanUpCancel’°dONLNdY4ô@**  message to ‘after’ Action Atoms.°ddPro†Ç
  3533. *z6Ç    ˇˇˇˇˇˇˇˇ1,|6Ç8†É°ddPro†Ç
  3534. *Ç6ä1,Ñ6ä8†É°ddPro†Ç
  3535. *ä6í1,å6í8†É°ddPro†Ç
  3536. *í6ö1,î6ö8†É°ddPro†Ç
  3537. *ö6¢1,ú6¢8†É
  3538. d    ™U™U™U™U"$-"$-°ddPro†Ç
  3539. D~Vçêzúöºz£öºEU厏ÄÒaaa!D<ġ†É
  3540. d°dONLNdÅDôP    *Successful or error dialog°dONLNdúPô\!*  appears.  If the user clicks the°dONLNdΩ\ôh* Continue button then the°dONLNd÷hôt* Installer continues with the°dONLNdÛtôÄ* next step then begins again°dONLNdÄôåˆ* with Rule execution.°ddPro†Ç
  3541. F‘R‹    ˇˇˇˇˇˇˇˇ1H÷R‹8†É
  3542. d    ™U™U™U™U"@-K"@-K°ddPro†Ç
  3543. ê~¢êê5”U˚5ŸU¯ë°è
  3544.  Ä@@Ä  ˇ‡Ä@¿@Ä?Ä Ä @@ ¿ÄÄ!ø¢†§†®†∞ø†Ä Ä á†Ä ¿¿†É
  3545. d°dONLNd0êôú&*Create script sub-heap again if°dONLNdPúô®
  3546. * we disposed of it earlier.°ddPro†Ç
  3547. í
  3548. û    ˇˇˇˇˇˇˇˇ1î û8†É
  3549. d    ™U™U™U™U"å-"å-°ddPro†Ç
  3550. ¨2π&"∏:ˆ µ4µ%"∏Vˆ"∏rˆ"∏éˆ"∏™ˆ"∏Δˆ"∏‚ˆ"∏˛ˆ"∏ˆ†É
  3551. d"®-"®-ˇ`dˇ ˇˇˇˇd
  3552. d, Palatino
  3553. .+~-C  H  A  P  T  E  R      2,     Helvetica
  3554.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú12
  3555. $°dONLNdQ~y(o~Installer Human Interface"°∂ 40°∂°∂
  3556. °dONLNd~*¨*∏DThis chapter describes the human interface aspects of Installer 4.0.
  3557. °dONLNd_B6V‰(Q6Easy Install Interface"°∂ V4V0°∂°∂
  3558. °dONLNdv[~g+H[The Easy Install interface now allows user selection of the target application folder and a°dONLNd“g~s!* blarger message area.  The target selection area is different for scripts requiring selection of an°dONLNd5s~d* 5application folder versus selection of a target disk.
  3559.     °dONLNdká~í∞*
  3560. Figure 2-1°dONLNdváΩí)?The Easy Install dialog.†Ç†é
  3561. ó6ºò>"OS2"OS2ó6»≈ˇ¿ÄΔj™ÄΔdÄÄΔ`øÌˇÔˇ˚ˇø`Äχ˛ů `0ÌÄ` øÌˇê˛ ÅÄ `0ˇ˙øˇÄÌÉ1«èÅÄ |8Ò„1„`ÔÄa     øÌˇ
  3562. √3#ôòÅ fdb˛3Äˇ˙øc˙ÄÏ„3Éôò fpaÛ33ÓÄ` øÌˇs1√ôò f8c33Ûˇ˚¯ø`ÄÏ30„ò fc33ÓÄÉ øÌˇ32côò fLc33ˇ˙øˇÄÏ·Ò¡èò f81Û1„ÓÄa    øÌˇ0Úˇ˚ˇøm| ÄÏ0›` Äχ›`ÄΔpw√ˇÄΔa    ÄΔ`“ÄΔ`ÄΔ`ÄΔpkÄΔˇÄΔa    ÄΔoæÄΔ`ÄΔ` ÄÔˇ¸⁄û ÄÔ⁄ˇ ÄÔ⁄`    ÄÔ¯ˇ¿w»Ä¿˛¿3˙ʯ0`Ä˝¿3˙ʯ` ÄáÄ«√è3¸˛Ê¯a ÄÃôÄΔfF#3¸¸Ê¯ˇ% ÄáŒÄΔg3¸¯Ê˛ÿ˛a
  3563. % Ä «ÄΔcÜ33¸Ê˛ÿ˛~Œ$ Ä √ôÄΔaΔ33˚‡Ê˛    ÃxœÄ`# Ä …ôÄΔdΔ33˚@Ê˛˛Ã¿`# Ä««ÄΔcÉ3˙Ê˛    ¸ÃÿpvÄ˝ÄıÊ˛    Ã¸Ã¿ˇÄ˝ÄıÊ˛    Ã¿Ã¿a
  3564. Ä˝ÙÊ˛    ÃƒÃ¿}ÄÄÔÊ˛    ÃxœÄ`ÄÔˇ˛Ê¸ ˛`ÄÔˇ˛Ê¸ ˛pf
  3565. Ä“¯ˇò>SOÑ2SOÑ2»6˘
  3566. Ä“¯`
  3567. Ä“¯0j™ Ä—¯ˇ¿dÄÄΔ`ÄΔ`ÄΔ`ÄΔˇÄΔa    ÄΔc˙ÄΔ`ÄΔ`ÄΔÉÄΔˇÄΔa    ÄΔm|
  3568. Ä…UP`    Ä»`Ä«pw    Ä»ˇÄ«a        Ä»`“Ä«`    Ä»`Ä«pk    Ä»ˇÄ«a        Ä»oæÄ«`    Ä»`Ä«û    Ä»ˇÄ«`        Ä»w»Ä«`    Ä»`Ä«a    Ä»ˇÄ«a
  3569.     Ä»~ŒÄ«`    Ä»`Ä«pv8ÄÒò¿0ò 0 ˛˛ps˘?¸ˇ2ÄâÄ¿0ò 0 ˛ IJ»√ı00˙a
  3570. ?=ÄÅò„0<¯x>xÒòûxÒ<Δ<8x é<xˇÄ¿ÒÁôòÒ≥¿f<l„>00„‡}Ä>7ÄÅôì`ÃÃ321òôå1ôò ffFdÃôÃÿ·ò√ôΔ`ffqì330>30˝`?=ÄÅôÉ¿ÃÃ380˘òôå1ôò ff>`ÃúÃÿqò√ò˘Ü`ffa√33`30`>7ÄÅôÉÄø31ôòôå1ôò fff`¸ôé¸Ã¿9ò√ôôá‡f~`„33¿30˝pf?=ÄÅôÉ¿ÿ31ôòôå1ôò fff`¿ôá¿Ã¿ò√ôôÜf``s33¿30ˇò>ÑOµ2ÑOµ2˘6*>.Äâôì`Ã3&1ôòôå1ôò fffdƒ    ôìƒÃ¿ôò√ëôÜ dba˛3√#30˝`?=ÄÒò„0 Ãx3˘òÜÒò<Δ>8xé xÿp¡ü‡˘É¿x<`„3√„0j™ÄθÄÂdÄÄ͸ÄÁ` ĉ`    Ä»`Ä«ˇ    Ä»a    Ä«c˙6ÄΔ˝¿ f¿˚`0å˝ÿ¿Äp1Ę`2ÄΔ˝
  3571. ¿ `¿c¸`0Ä˝ ¿Ä¿1Äı`90ÄÁ√¿8x«á<>Ê8Ãc„|8Ò„1„Ãx¯ Ãÿœáò¯ÄÒ‡y¯É7ÄΔf`d˛Ãåfffdÿc32fdb321åÃà ÃÿÃÃ˛ôòôÅò¿1ôòˆˇ9ÄΔf`p˛Ã& fffpc38fpaÛ1ÒåÃà ÃÿÃÃôôòôÅò¿1ôò¯a    70ÄΔg‡8¸œÃ ~ff8‡c3f8c331åÃà ÃÿÃÃôô¯ôÅò¿1ô¯ˆm|90ÄΔf¿Ã `ffc3fc331åÃà ÃÿÃÃôôÄôÅò¿1ôį`7$ÄΔf LƒÃLåbffLÿ¿c3&fLc331åÃà »Ã¿ÃÃ˛ôàôÅò¿1ôàˆ`90Äfc¿8x«á<>Ê8ÿc3f81Û1ÃxÃÿ믯ôÄ¿ò¯pwÄ«ˇ    Ä»a    Ä«`“    Ä»`Ä«`    Ä»pkÄ«ˇ+Ĉ ¿¿pÄ0˝¿ 0Ûa    *Ę ¿¿»Ä Ä 0˝00˛0Òoæ5,Ä≥√áè¯ˇáèá«á¿¡ò„«è¯ yôè<èü‡8q·Δ|x„‡Ù`.ÄΔfL˘Ã¿·ôëåÃÃå1ôëúfúôê<Ú3&f1ôì0Ú`0ÄÜf ˘Ã¿qô¡åÃÃå1ôèòfòô¿/±Ûf1ô√0Ùû3ÄáÊ ˛Ã#œÃÜÿ9ò·èÃÃôå1ôôò~òò‡'33f1ò„0Úˇ4ÄÜ ˝Ã" Ãà ¿òqå Ãôå1ôôò`òòp"33f1òs0Ù`    2ÄÜ&L˝Ã"LÃÃL¿ôô1åLà   ôå1ôòbòô0 33&f1ô33Úw»5,ÄÉ√áåÃë嫫á¿p¯‡«åà ˛ò<ôò‡ 1ÒΔf„3Ù` ÄÛ÷`ÄÛÿa ÄÛ÷ˇ    Ä»a
  3572. Ä«~Œ    Ä»`Ä«`    Ä»pvÄ«ˇ    Ä»a
  3573. Ä«}Ä    Ä»`Ä«`    Ä»pfÄ«ˇò>µOÊ2µOÊ2*6[    Ä»`Ä«j™    Ä»dÄÄ«`    Ä»`Ä«`    Ä»ˇÄ«a        Ä»c˙Ä«`    Ä»`īɠ   Ä»ˇÄ«a        Ä»m|Ä«`    Ä»`Ä«pw    Ä»ˇÄ«a        Ä»`“Ä«`    Ä»`Ä«pk    Ä»ˇÄ«a        Ä»oæÄ«`    Ä»`Ä«û    Ä»ˇÄ«`        Ä»w»Ä«`    Ä»`Ä«a    Ä»ˇÄ«a
  3574.     Ä»~ŒÄ«`    Ä»`Ä«pv    Ä»ˇÄ«a
  3575.     Ä»}ÄÄ«`
  3576. Ä…™®`ÄΔpfÄΔˇò>ÊO2ÊO2[6åÄΔ`ÄΔj™ÄΔdÄÄΔ`ÄΔ`ÄΔ`ÄΔˇÄΔa    ÄΔc˙ÄΔ`ÄΔ`ÄΔÉÄΔˇÄΔa    ÄΔm|
  3577. Äå ` ”`
  3578. ÄÄ
  3579. Ä”`Äú{›„ûÁ< ‹ˆ¿‘pwÄUY∂¡ç∞Ãm∂ ÕáÖÎU͡
  3580. Äæqç≥Ãm∂ ÃÁ”a    Äç∂Ãm∂
  3581. å7ÄÏÍ`“ÄÕ≥Δg6
  3582. Ê¿‘`Äfl˚?ˆˇ¸`Ä◊¿ˆ¿˝pkÄfl˚Ĉ@˝ˇÄÿı ˝a    Äfl¸ı ˝oæÄψˇ˙˝¿0˝ ˝`!Ä̈ ¸˝`0˝ ˝`Äψ˙˝ffx˝ ˝û!ÄÌ ˆ¸˝ff0˝ ˝ˇÄÏ ˆ˙˝ff0˝ ˝`    )ÄÌ A¸˝ff0˝ ˝w»&ÄÏ ˛ Ä˙˝ff0˝ ˝`)ÄÌ PA¸˝ff0˝ ˝`&ÄÏ  "" àÇ ˙˝√Ê˝ ˝a&ÄÌ A@¸¸`˚ ˝ˇÄÏ  *  à¢Ä˙ı ˝a
  3583. "ÄÌ ˛Q@¸ı ˝~ŒÄÏ   " à" ˘Äˆ@˝`"ÄÌ AA˚¿ˆ¿˝`ÄÏ ˘˘?ˆˇ¸pvÄÌ ˘ÍˇÄÏ 
  3584. ˘Ëa
  3585. Ä̈Í}ÄÄψ Ë`Ä̈ˇÍ`ÄΔpfÄ˙˛ˇÄÎ͡ò>OG2OG2å6ºĢ ˛@”`Ä˙ ˛@ÎÍj™Ģ ˛@”dÄÄ˙ ˛@ÎÍ`Ģ ˛@”`Ä˙ ˛@˘ˆˇÍ`Ģ"˛@˘ˆ ˘ıˇ¿˝ˇ"Ä˙ ˛@˘ˆ¸ıˇ˝a    Ģ ˛@˘ ˆ˙ıˇ¯˝c˙#Ä˙˛ˇÄ˘ ˆ¸Ĉ|˝` ÄÏ  p¿ ¯¿˙?ˆˇ˝`#ÄÌ »¿ ø¿ˆfi˝É ÄÏ  ¡ôô„èÄëÄ˙ĈN˝ˇ"ÄÌ ·ôòΔL¿ÃÃõ¸ı.˝a    ÄÏ  qôòΔ ¿ÃŒ˙ı.˝m|+ÄÌ 9ôòΔ ¿Ã«¸˛0ò˛.˝`3Ä˚ ∏˙  ôòΔ ¿Ã√û˙˛0ò˛.˝`6ĸ `§˙ ôôΔL¿Ã…õ¸˛>xÒò˛.˝pw3Ä˚
  3586. ¶3sòÓ¢˙  q˛c忯«Ä˙˛321ò˛.˝ˇ.ĸ    !II%    ¢˙ ˆ¸˛380˘ò˛.˝a    +Ä˚'AI$…¢˙ ˆ˙˛31ôò˛.˝`“.ĸ)II$)§˙ ˆ¸˛31ôò˛.˝`+Ä˚'1Hô…∏˙ˆ˙˛3&1ôò˛.˝`#Ä̈ ¸˛3˘ò˛.˝pkÄψˇ˙ı.˝ˇÄfl¸ı.˝a    Äÿı.˝oæÄfl¸ĈN˝`Äÿ¿ˆfi˝`Äfl¸?ˆˇ˝ûÄÿĈ|˝ˇÄfl¸ıˇ¯?ˇ‡    Äÿıˇ w»ÄfiU˚ıˇ¿ `    Ä»'`    Ä»$a    Ä»$ˇ    Ä»$a
  3587.     Ä»$~Œ    Ä»$`    Ä»'Ò`    Ä»!pv    Ä»!ˇ    Ä»!a
  3588.     Ä»!ˇ}Ä    Ä» `≈ˇ‡Δˇf†è†Éˇ⁄dˇ ˇˇˇˇd
  3589. d, Palatino
  3590. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3591.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú13
  3592. °dONLNdQ~`?(\~Using the Target Disk Interface"°∂ _|_0°∂°∂
  3593. °dONLNd d~p$*aIf your product must always be installed into a specific location on the target disk, then you’ll°dONLNdÇp~|** aprobably want to limit the user to only selecting from the mounted volumes.  This is the case for°dONLNd‰|~à* Xproducts, such as system software, that need to be installed predominately in the System°dONLNd=à~îÿ* Folder.  Setting the ,
  3594. Courier°dONLNdRàÿî>)ZuseDiskTargetMode°dONLNdcà>î%)f7 flag in the preference resource tells the Installer to°dONLNdõî~†Ü(ù~;present an interface compatible with the old Installer 3.X.°dONLNd◊®~¥*ZClicking Switch Disk cycles through the mounted volumes.  Clicking Eject Disk will eject a°dONLNd2¥~¿fl* chosen ejectable disk.
  3595. °dONLNdI‘~„h*"&Using the Application Folder Interface"°∂ ‚|‚0°∂°∂
  3596. °dONLNdpÁ~Û!*]If your script installs a product such as an application which can be placed most anywhere on°dONLNdŒÛ~ˇ* \the user's Macintosh, then you’ll probably want to allow the user to select a target folder.°dONLNd,ˇ~ ≥* Setting the °dONLNd8ˇ≥ %)5useFolderTargetMode°dONLNdKˇ%  )r7 flag in the preference resource tells the Installer to°dONLNdÉ ~(~]present an interface to the user for selecting the target folder in both the Easy Install and°dONLNd·~#ë* ?Custom Install dialogs.  This interface is shown in Figure 2-2.°dONLNd!+~7·*Much like the current °dONLNd7+·7))c special-xxxx°dONLNdC+)7∫)H! folder path identifier, the new °dONLNdd+∫7¸)ë folder-user°dONLNdo+¸7)B folder°dONLNdw7~C(@~^path identifier will be the folder path selected by the user.  When the user clicks the Select°dONLNd÷C~O* ]Folder button a modified standard file dialog appears to allow selection of a new or existing°dONLNd4O~[Â* Rfolder.  This dialog is discussed in the section “Using the Select Folder Dialog”.
  3597.     °dONLNdác~n∞*
  3598. Figure 2-2°dONLNdícΩn|)?2The interface for selecting an application folder.†Ç
  3599. q6Œò>:(ó:/óq6Œ≈¿≈¿≈¿≈¿≈¿≈¿≈¿≈¿≈¿≈¿≈¿˛
  3600. <¿√”¿˛
  3601. 6√”¿˛ 38˜ª«=Œx8œ9’¿
  3602. ™≥mÉaò€ll€m¿Ï™Í¿˛ 3|„gò€ll€}Ä’¿6`3mò€ll€aÄÌÍ¿˛ <9·õgåŒl8œ9Ä’¿fl˚˜ˇ˛¸¿◊ĘÄ˝¿fl¸ıÄ˝¿◊ı@˝¿fl¸ı@˝¿◊˝Ä `˝@˝¿fl¸˝ ¿`˝@˝¿◊˝ ÃÃ˝@˝¿fl¸˝ ÃÃ`˝@˝¿◊˝ ÃÃ`˝@˝¿ ˙¯Ë¸˝ ÃÃ`˝@˝¿¯‚˝ ÃÃ`˝@˝¿ ˙˸˝ ÃÃ`˝@˝¿¯‚˝áÃ0˝@˝¿˙?ˇˇ˛Í¸¸¿˚@˝¿¯@‰ı@˝¿˙@͸ı@˝¿¯@‰ıÄ˝¿ ˙@˘Ûˇ¯¸ĘÄ˝¿¯@˙Û˙˜ˇ˛¸¿˙@˙ÛÍ¿¯@˙ÛÈ¿˙@˙ÛÍ¿¯@˙
  3603. `‡˝È¿"˙@˙
  3604. 2`˝Í¿ ¯@˙0<c√èΔ><lÈ¿#˙@˙8˛fF˛fpÍ¿ ¯@˙˛fΔ˛f`È¿#˙@˙~gÊff~`Í¿ ¯@˙`fff``È¿#˙@˙&bf&Fffb`ÿÍ¿ ¯@˙<c√ÉΔ><`ÿÈ¿˙@˙ÛÍ¿¯@˙Û˚ıˇÄ˝¿˙˛ˇ˙Û¸ıˇ‡˝¿ÌÛ˚ıˇ˝¿ÔÛ¸ı¯˝¿ÏÛˇ¯˚˜ˇ˛8˝¿%˛@êàÓ¸=Ęº˝¿˝˛@ÄÄË9ıú˝¿$3±Äß8≥Ÿúbs,Ô¸:ı\˝¿˝
  3605. JJ@§§îÑäRíî∞È:ı\˝¿-zJAÙ§îäRíó†Ô¸:˛ `0˛\˝¿(˝
  3606. BJA§î§äRíî È:˛ `0˛\˝¿-2IÅ8ìIíbs Ô¸:˛ |8Ò„0˛\˝¿˘ ·:˛ fdb30˛\˝¿"˚ Á¸:˛ fpaÛ0˛\˝¿◊:˛ f8c30˛\˝¿fl¸:˛ fc30˛\˝¿¯˘PÍ:˛ fLc30˛\˝¿.@H
  3607.  Ä "‡P¸:˛ f81Û0˛\˝¿ ˝@@
  3608. 1Ä "ê†Í:ı\˝¿$gqÅŸ“*òÕŒc∏"àÔ¸:ı\˝¿ ˛îÇJBJ$Ö%$î$>àÈ:ı\˝¿$îÇK¬Iò ù$ì$"àÔ¸9ıú˝¿"˛îÇJHT •%$ê§"êÈ=Ęº˝¿&dÅIÅÀí ú≈"g$"‡Ô¸˜ˇ˛8˝¿◊ı¯˝¿fl¸ıˇˇ¿◊ıˇ‡@¿
  3609. fi™¸ıˇÄ@¿«O‡¿«H ¿«H>¿«H"¿«H"¿«H"¿«O‚¿«B¿«B¿«B¿«C˛¿«@¿≈ˇ¿≈ˇ¿†É
  3610. d
  3611. °dONLNd≈÷~‚(fl~SThe icon and name for the selected folder depends on the folder chosen by the user:,
  3612.  
  3613. Zapf Dingbats
  3614.     °dONLNdÏ~ıÖ*n
  3615. °dONLNdÍêˆ()_If a folder is selected, the folder’s icon will appear with the folder's name on the first line°dONLNd{ˆêÇ* 4and “on the disk “Macintosh HD”” on the second line.
  3616.     °dONLNd≤ ~Ö(~n
  3617. °dONLNd¥
  3618. ê˚)RIf the root level of a volume is selected, the volume’s icon and name will appear.°dONLNd~*#('~]A default target folder is always recommended to the user when first launching the Installer.°dONLNdf*~6* [The scriptwriter can optionally override the Installer’s suggested default folder using the°dONLNd¬6~B÷* preference resource.
  3619. °dONLNd◊V~eÆ*"Buttons"°∂ d|d0°∂°∂
  3620. °dONLNdfli~uÚ*Buttons and their actions:
  3621.     °dONLNd˙~àÖ*n
  3622. °dONLNd¸}êâ)XInstall (or Remove) — Starts the installation or removal.  The button is enabled in Easy°dONLNdUâêï* XInstall if there was not an error preventing the installation from beginning.  In Custom°dONLNdÆïê°,* \Install and Custom Remove, the button is enabled only if one or more items are selected from°dONLNd     °ê≠µ*     the list.
  3623.     °dONLNd    ∑~¿Ö(æ~n
  3624. °dONLNd    µê¡C)'Quit — Quits the Installer application.ˇ%òdˇ ˇˇˇˇd
  3625. d, Palatino
  3626. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3627.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú14,
  3628.  
  3629. Zapf Dingbats
  3630. °dONLNdS~\Ö(Z~n
  3631. °dONLNdQê]*)XHelp — Opens a the Help dialog.  The Help dialog is explained in section “Providing User°dONLNd[]êi∞* Help”.
  3632.     °dONLNdbs~|Ö(z~n
  3633. °dONLNddqê})WSwitch Disk — Changes the currently selected target disk to the next disk in the volume°dONLNdº}êâ+* _list.  If no other volumes are available to choose from, this button is dimmed.  This button is°dONLNdâêïÖ* 5only shown when using the target disk interface mode.
  3634.     °dONLNdRü~®Ö(¶~n
  3635. °dONLNdTùê©!)\Eject Disk — Ejects the currently selected target disk.  The button is dimmed if the current°dONLNd±©êµ* [volume cannot be ejected.  This button is only visible when using the target disk interface°dONLNd
  3636. µê¡´* mode.
  3637.     °dONLNdÀ~‘Ö(“~n
  3638. °dONLNd…ê’+)\Select Folder — Opens the folder selection dialog.  The folder selection dialog is explained°dONLNdr’ê·$* [in section “Selecting the Target Application Folder”.  If the scriptwriter has enabled this°dONLNdŒ·êÌ* Wfeature, and the Option Key is down, the button text changes to “System Disk” and opens°dONLNd&Ìê˘* Wthe system volume selection dialog.  The system volume selection dialog is explained in°dONLNd~˘ê* Rsection “Selecting the System Volume”.  This button is only visible when using the°dONLNd—ê,* "application folder interface mode.
  3639. °dONLNdÙ)6=ˇ(86Custom Install Interface"°∂ =4=0°∂°∂
  3640. °dONLNd
  3641. B~N$+H]The Custom Install dialog can provide experienced users with the flexibility needed to create°dONLNdkN~Z5* )customized installations of your product.
  3642.     °dONLNdïb~m∞*
  3643. Figure 2-3°dONLNd†bΩm")?The Custom Install dialog†Ç†é
  3644. r6óò>"OS2"OS2r6£≈ˇ’UÄΔ`ÄΔ`ÄΔ`øÌˇÔˇ˚ˇø`Äχ˛ů `0ÌÄ` øÌˇê˛ ÅÄ `0ˇ˙ø`ÄÌÉ1«èÅÄ |8Ò„1„`ÔÄ` øÌˇ
  3645. √3#ôòÅ fdb˛3Äˇ˙ø`ÄÏ„3Éôò fpaÛ33ÓÄ` øÌˇs1√ôò f8c33Ûˇ˚¯ø`ÄÏ30„ò fc33ÓÄ` øÌˇ32côò fLc33ˇ˙ø`ÄÏ·Ò¡èò f81Û1„ÓÄ`øÌˇ0Úˇ˚ˇø` ÄÏ0›` Äχ›`ÄΔ`≈ˇ‡ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ` ÄÔˇ¸⁄` ÄÔ⁄` ÄÔ⁄`ÄÔ¯ˇ¿` Ä¿˛¿`˝Ê¯0` Ä ˛¿`˝Ê¯`!Äcè?‡¯q„Δ`˛Ê¯`!ÄfF330ûƒf`¸Ê¯`'Äg330Ç√Ê`¯Ê˛ÿ˛`'ÄcÜ330ÃpΔf`Ê˛ÿ˛`'ÄaΔ330Ã8Δf`˛‡Ê˛    ÃxœÄ`&Ä&dΔ330ÃòΔf`˛@Ê˛˛Ã¿`&Ä√„É30ÃpcÊ`˝Ê˛    ¸Ãÿ`ÄÔÊ˛    Ã¸Ã¿`ÄÔÊ˛    Ã¿Ã¿`ÄÔÊ˛    ÃƒÃ¿`ÄÔÊ˛    ÃxœÄ`ÄÔˇ˛Ê¸ ˛`ÄÔˇ˛Ê¸ ˛`
  3646. Ä“¯`ò>SOÑ2SOÑ2£6‘
  3647. Ä“¯uU
  3648. Ä“¯0` Ä—¯ˇ¿`ÄΔ`Ä» Ä@ÿ`Ä( Ä    @ÿ`Ä1íΔt¨«`„„πâ1¿ÿ`Ä    JT    !$±(êîÇîIJ@ÿ`Ä    z    Á$°ÊêóÇì…z@ÿ`Ä)BT        $°êîêíIB@ÿ`Ä…1í«†Œ`„ó    …1¿ÿ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`
  3649. Ä…ˇ¯` ÄÀ` ÄÀ`į—ˇ `    Ä@˛ps€Ñ`    Ä @ IJ»√€ƒ!`!Ä
  3650. @ é<xˇÄ¿ÒÁôòÒ≥¿‡ƒ@à`!Ä    @ôÃÿ·ò√ôΔ`‡0ƒÄH`!ÄÄ@úÃÿqò√ò˘Ü`‡≈·Ë`!Ä@@ôé¸Ã¿9ò√ôôᇇƒ!` ÄÄ@ôá¿Ã¿ò√ôôÜfl8ƒ!`!Ä    @    ôìƒÃ¿ôò√ëôÜ ‡ƒ!`!Ä
  3651. @é xÿp¡ü‡˘É¿‡ˇƒ?`Ä @Ä”ˇÑ`įē`ĸ—ˇ¯` ÄÀˇ¯` ÄÀ` ÄÀ`į—ˇ`
  3652. Ä@Ä0å÷Ü`
  3653. Ä @ ¿Ä÷Δ` Ä
  3654. @ Õ≥„ï|ÿΔ` Ä    @ Œ31åÃÃÿ0Δ` ÄÄ@å31åÃÃÿΔ` Ä@@ 31åÃÃÿΔ` ÄÄ@ 31åÃÃÿ8Δ` Ä    @ 31åÃÃÿΔ` Ä
  3655. @ 30ÃÃ|ÿˇΔ`Ä @˚ ◊ˇÜ`į˚å÷`Ęx÷ˇ¯` ÄÀ` ÄÀDH`ò>ÑOµ2ÑOµ2‘6 ÄÀuUį—ˇDH` Ä@ ˛ÄòflÖ` Ä@  ˛˛@flƒDH`$Ä@#«ôòÒ∂f|>è<ëçû„≈`$ġ‡@&côôΔΔff ΔûŒ3„0ƒDH`$Ä@@O» ¶côôáÜffåΔëÃ3„≈`$Ä Ä@    Á„ôôáffÃΔ˛Ã?„ƒDH`$Ä@ÊôôáÜffÃΔ˛Ã0„8≈`$Ä
  3656. @f#ëôÜΔffÃΔÃåÃ1„ƒDH`$Ä@#¡ü‡ÒÜff>áÜ ˇÃ„ˇ≈`Ä@¯⁄ˇÑDH`į¯FŸ`ÄÙ<ŸDH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝
  3657. Ģò0¿‹Ö`Ä˝Ä¿0ŸƒDH`Ä˝ ÑÄ¡ò>6œá¿fi≈`Ä˝ HÄ¡ôò3#8Ãÿfi0ƒDH`Ä˝ 0ÄÒôò30Ãÿfi≈`Ä˝ 0Ä¡ô¯330ÃÿfiƒDH`Ä˝ HÄ¡ôÄ330Ãÿfi8≈`Ä˝ ÑÄ¡ôà330ÃÿfiƒDH`Ä˝ Ä¡ò30ë¿fiˇ≈`Ä˝į¿›ˇÑDH`Ä˝ˇÄ˘¿‹`ÄÚÄ‹DH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝    įΔ?f€Ö`Ä˝    Ä¿Δ f€ƒDH`Ä˝
  3658. Ä¡Á√ΔÃ<f`‹≈`Ä˝
  3659. Ä¿Δfg Ff¿‹0ƒDH`Ä˝
  3660. ÄΔff >gÄ‹≈`Ä˝    Ä¿ΔgÊ fg€ƒDH`Ä˝
  3661. Ä¿Δf fgÄ‹8≈`Ä˝
  3662. Ä¿Δf& ff¿‹ƒDH`Ä˝
  3663. įfcΔ >f`‹ˇ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀ`ò>µOÊ2µOÊ266Ä˝ˇÄ‘ˇDHuUÄ˝
  3664. ů‡ ¿‹Ö`Ä˝
  3665. Ä`Ä ¿‹ƒDH`Ä˝
  3666. Äa„1„·áåË≈`Ä˝
  3667. Äc3c31àÃÿ‹0ƒDH`Ä˝
  3668. Äc3√31áÃ‹≈`Ä˝
  3669. Äc3ÉÛ1åÇ‹ƒDH`Ä˝
  3670. Äc3√1åÃ‹8≈`Ä˝
  3671. Äc3c1åÃÿ‹ƒDH`Ä˝
  3672. Äa„1„1áÃˡ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝ÄÄ@?<|⁄Ö`Ä˝Ä¿¿ bf⁄ƒDH`Ľķ«á `f⁄≈`Ä˝ÄÛ»Ãå`f⁄0ƒDH`Ä˝Äæ«Ã `|⁄≈`Ä˝ÄúÃà ``⁄ƒDH`Ä˝ÄàÃà ``⁄8≈`Ä˝ÄÄÃÃåb`⁄ƒDH`Ä˝ÄÄ«« <`⁄ˇ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀˇ¯`į—ˇ`Ä@ Δ31Äps⁄Ñ`Ä @ ΔÄ»√⁄ƒ?` Ä
  3673. @ œ33ÿ¿ÒÁôòÒ≥¿flƒ!` Ä    @ Δ31å¿·ò√ôΔ`fl0ƒ!` ÄÄ@ Δ31å¿qò√ò˘Ü`flƒ!` Ä@@ Δ31å¿9ò√ôôá‡fl≈·Ë`ÄÄ@ Δ31å¿ò√ôôÜfi8ƒÄH` Ä    @ Δ31å¿ôò√ëôÜ flƒ@à` Ä
  3674. @É30«¿p¡ü‡˘É¿flˇƒ!`Ä @¸¿÷ˇÑ`į˝¿’ `ĢĒ` ÄÀ`
  3675. Ä…ˇ¯`ÄΔ`ÄΔ`ò>ÊO2ÊO266gÄΔuU(ĸ˚∞!į˘»ÄÓ Äį¬"¸`'ĸÄ˚ ÄÄ"
  3676. )ÌÄÄIJ$¸`*ĸY“„¿»ôì8ò@*Ì òŒcÉ∑ò@"(¸`*ĸJê• %ê§§LÌ $•$îÑ$s¬0¸`)ĸIò ì°‡Â짺 äÏ
  3677. ºΩÙÉ<
  3678. "(¸`*ĸàTî•"$à!    Ì †°$ÑÄî ä"$¸`+ĸ í„ò¿‚ì∏ò@pæ#ËÄÓ ò¬cáò@q¬"¸`įįÄ⁄`Ä¯Ä˘Ÿ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`
  3679. Äå ` ”`
  3680. ÄÄ
  3681. Ä”`Äú{›„ûÁ< ‹ˆ¿‘`ÄUY∂¡ç∞Ãm∂ ÕáÖÎUÍ`
  3682. Äæqç≥Ãm∂ ÃÁ”`Äç∂Ãm∂
  3683. å7ÄÏÍ`ÄÕ≥Δg6
  3684. Ê¿‘`Äfl˚?ˆˇ¸`Ä◊¿ˆ¿˝`Äfl˚Ĉ@˝`Äÿı ˝`Äfl¸ı ˝`Äψˇ˙˝¿0˝ ˝`!Ä̈ ¸˝`0˝ ˝`Äψ˙˝ffx˝ ˝`!ÄÌ ˆ¸˝ff0˝ ˝`ÄÏ ˆ˙˝ff0˝ ˝`)ÄÌ A¸˝ff0˝ ˝`&ÄÏ ˛ Ä˙˝ff0˝ ˝`)ÄÌ PA¸˝ff0˝ ˝`&ÄÏ  "" àÇ ˙˝√Ê˝ ˝`&ÄÌ A@¸¸`˚ ˝`ÄÏ  *  à¢Ä˙ı ˝`"ÄÌ ˛Q@¸ı ˝`ÄÏ   " à" ˘Äˆ@˝`"ÄÌ AA˚¿ˆ¿˝`ÄÏ ˘˘?ˆˇ¸`ÄÌ ˘Í`ÄÏ 
  3685. ˘Ë`Ä̈Í`Äψ Ë`Ä̈ˇÍ`ÄΔ`Ä˙˛ˇÄÎÍ`ò>OG2OG2g6óĢ ˛@”uUÄ˙ ˛@ÎÍ`Ģ ˛@”`Ä˙ ˛@ÎÍ`Ģ ˛@”`Ä˙ ˛@˘ˆˇÍ`Ģ"˛@˘ˆ ˘ıˇ¿˝`"Ä˙ ˛@˘ˆ¸ıˇ˝`Ģ ˛@˘ ˆ˙ıˇ¯˝`#Ä˙˛ˇÄ˘ ˆ¸Ĉ|˝` ÄÏ  p¿ ¯¿˙?ˆˇ˝`#ÄÌ »¿ ø¿ˆfi˝` ÄÏ  ¡ôô„èÄëÄ˙ĈN˝`"ÄÌ ·ôòΔL¿ÃÃõ¸ı.˝`ÄÏ  qôòΔ ¿ÃŒ˙ı.˝`+ÄÌ 9ôòΔ ¿Ã«¸˛0ò˛.˝`3Ä˚ ∏˙  ôòΔ ¿Ã√û˙˛0ò˛.˝`6ĸ `§˙ ôôΔL¿Ã…õ¸˛>xÒò˛.˝`3Ä˚
  3686. ¶3sòÓ¢˙  q˛c忯«Ä˙˛321ò˛.˝`.ĸ    !II%    ¢˙ ˆ¸˛380˘ò˛.˝`+Ä˚'AI$…¢˙ ˆ˙˛31ôò˛.˝`.ĸ)II$)§˙ ˆ¸˛31ôò˛.˝`+Ä˚'1Hô…∏˙ˆ˙˛3&1ôò˛.˝`#Ä̈ ¸˛3˘ò˛.˝`Äψˇ˙ı.˝`Äfl¸ı.˝`Äÿı.˝`Äfl¸ĈN˝`Äÿ¿ˆfi˝`Äfl¸?ˆˇ˝`ÄÿĈ|˝`Äfl¸ıˇ¯?ˇ‡Äÿıˇ `ÄfiU˚ıˇ¿ `    Ä»'`    Ä»$`    Ä»$`    Ä»$`    Ä»$`    Ä»$`    Ä»'Ò`    Ä»!`    Ä»!`    Ä»!`    Ä»!ˇ`    Ä» `≈ˇ‡Δˇ‡†è†É
  3687. d
  3688. °dONLNd∫≠~º(∏~Custom Install List"°∂ ª|ª0°∂°∂
  3689. °dONLNdŒ¿~Ã
  3690. *VHierarchical custom items allow many opportunities to provide specific choices without°dONLNd%Ã~ÿ * bcluttering the list or confusing novice users.  Users click on the familiar checkbox to select andˇñdˇ ˇˇˇˇd
  3691. d, Palatino
  3692. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3693.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú15
  3694. °dONLNdQ~]'(Z~`deselect items in the custom list.  Selection rules apply to the relationship between parent and°dONLNda]~iµ* child items:,
  3695.  
  3696. Zapf Dingbats
  3697.     °dONLNdns~|Ö*n
  3698. °dONLNdpqê}Á)KWhen the user selects/deselects an open parent item, all children are shown°dONLNdº}êâ&* Yselected/deselected as well.  This helps the user understand the relationship between the°dONLNdâêï* [parent and child items.  Selecting a parent is equal to selecting all the parent’s children°dONLNdrïê°‘* and vice versa.
  3699.     °dONLNdÇ´~¥Ö(≤~n
  3700. °dONLNdÑ©êµ()]If the user opens an unselected parent item and begins to select child items, the parent item°dONLNd‚µê¡* Vis displayed with a mixed-state checkbox.  A parent item becomes selected if all child°dONLNd9¡êÕ¸* Sitems are selected.  If all child items are unselected the parent item is displayed°dONLNdçÕêŸ(* [unselected.  A parent item is displayed as a mixed-state checkbox if a child (which is also°dONLNdÈŸêÂ~* 4a parent item) is displaying a mixed-state checkbox.
  3701. °dONLNd˘~°(~-Selected Size and Disk Space Available Values"°∂ |0°∂°∂
  3702. °dONLNdL ~*\Two additional information fields show the total size of the currently selected custom items°dONLNd©~$!* ]and the disk space available on the selected target disk.  The size information is very handy°dONLNd$~0#* _for users choosing which software options to install.  The scriptwriter will have the option to°dONLNdg0~<û* Bshow or hide these fields using a flag in the preference resource.
  3703.     °dONLNd™F~Qö*NOTE
  3704. °dONLNdØT~`*\The Installer only uses the leaf package sizes of the selected custom items to calculate the°dONLNd `~l* \selected size value.  For packages that referenece both atoms and sub-packages, it’s best to°dONLNdil~x+* ^create another package that contains only the atoms and reference that package in place of the°dONLNd»x~Ñú* atoms.°dONLNdœå~ò¶*XFor example, if you have this:                                         Use this instead:
  3705.     °dONLNd(fl~ËΔ*Q                        °ddPro†Çˇˇˇˇˇˇ
  3706. †ΔÊË    1¢˘≥    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3707. £¯±
  3708. .ˇF"F"°dONLNdˇˇ(≠˚'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)p°dONLNdˇˇ)k°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3709. †ΔÊË    1ª◊È    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3710. º◊ ı°dONLNdˇˇ(Δ⁄'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)p°dONLNdˇˇ)k°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3711. †ΔÊË    1ª˘Ã    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3712. º˙ °dONLNdˇˇ) '°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)f°dONLNdˇˇ)a°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3713. †ΔÊË    1ªÃ9    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3714. º 7O†°dONLNdˇˇ)'O†°dONLNdˇˇ)iO†°dONLNdˇˇ)nO†°dONLNdˇˇ)rO†°dONLNdˇˇ)aO†°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3715. †ΔÊË    1’»ÊÁ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3716. ÷…‰‰°dONLNdˇˇ(‡Ã'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)f°dONLNdˇˇ)a°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3717. †ΔÊË    1’ÈÊ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3718. ÷͉ü°dONLNdˇˇ)'ü°dONLNdˇˇ)iü°dONLNdˇˇ)nü°dONLNdˇˇ)fü°dONLNdˇˇ)aü°dONLNdˇˇ)'†ô†ó†ú
  3719. †ΔÊË"±‡    "±    "±#    " Ê
  3720. " Ê
  3721. ˇˇˇˇˇˇ    1¢î≥≥    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3722. £ì±±°dONLNdˇˇ(≠ñ'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)p°dONLNdˇˇ)k°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3723. †ΔÊË    1ªrÃë    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3724. ºr ê°dONLNdˇˇ(Δu'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)p°dONLNdˇˇ)k°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3725. †ΔÊË    1’cÊÇ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3726. ÷d‰°dONLNdˇˇ(‡g'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)f°dONLNdˇˇ)a°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3727. †ΔÊË    1’ÑÊ£    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3728. ÷Ö‰†ü°dONLNdˇˇ)'ü°dONLNdˇˇ)iü°dONLNdˇˇ)nü°dONLNdˇˇ)fü°dONLNdˇˇ)aü°dONLNdˇˇ)'†ô†ó†ú
  3729. †ΔÊË"±¢‡    "±°#    " Å
  3730. " Å
  3731. ˇˇˇˇˇˇ    1ª∑Ã÷    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3732. º∂ ‘°dONLNdˇˇ(Δπ'°dONLNdˇˇ)i°dONLNdˇˇ)n°dONLNdˇˇ)p°dONLNdˇˇ)k°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3733. †ΔÊË    1’ßÊΔ    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3734. ÷®‰√ü°dONLNdˇˇ(‡´'ü°dONLNdˇˇ)iü°dONLNdˇˇ)nü°dONLNdˇˇ)fü°dONLNdˇˇ)aü°dONLNdˇˇ)'†ô†ó†úˇˇˇˇˇˇ
  3735. †ΔÊË    1’…ÊË    ˇˇˇˇˇˇˇˇ8†õ°ñ †ò°ddPro(
  3736. ÷…‰Âœ†°dONLNdˇˇ)'œ†°dONLNdˇˇ)iœ†°dONLNdˇˇ)nœ†°dONLNdˇˇ)rœ†°dONLNdˇˇ)aœ†°dONLNdˇˇ)'†ô†ó†ú
  3737. †ΔÊË" ≈
  3738. " ≈
  3739. †É
  3740. d
  3741.     .°dONLNdˇˇ+  u
  3742. °dONLNdD¸~ (~Custom Item Information"°∂ 
  3743. |
  3744. 0°∂°∂
  3745. °dONLNd\~*[Custom item information can be viewed in a separate info dialog by clicking on the button (†Ç†é
  3746. "êepep"¿Ä$Ñ0Ä4å?Ñ?Ñ?é?Ä0?φè†É
  3747. d°dONLNd∑$(($)°dONLNdπ~(Û(%~Vto the right of custom item text.  The custom item info dialog is shown in Figure 2-4.ˇ˛dˇ ˇˇˇˇd
  3748. d, Palatino
  3749. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3750.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú16°dONLNdQ~\∞(Y~
  3751. Figure 2-4°dONLNd QΩ\.)?The Custom Item Info Dialog†Ç†é
  3752. _~júò$8±çœ8±çœ_~¥úfiˇ¸ÄflÄflüflˇ‰üflˇ‰òfldòfldòfldòfleòflgòfldòfldòfldòfldòfldòfldòfld ò?ˇÂd
  3753. ò@ ÄÊd
  3754. ò@@ÄÄÊd
  3755. ò@?ˇÄÊd
  3756. ò@˛ÄÊd
  3757. ò@˛ÄÊd
  3758. ò@ÄÊd
  3759. ò@ ÄÊd
  3760. òC˛/ËÄÊd
  3761. òD((ÄÊd
  3762. òE˝((ÄÊd
  3763. òE((ÄÊd
  3764. òE/ËÄÊd
  3765. òE ÄÊd
  3766. òE˝ ËÅÂÄÄÄÏd òD ÅÄ"ÄÍdòD Å ò „-∏‡ÌdòDѧê∞• ÌdòDź솕 ÌdòC˛Å†" ÌdòC˛Åò솧‡Ìdò@@Ä˚ Ìdò@@Ä˚¿Ìd
  3767. ò@‡ÄÊd
  3768. ò@‡ÄÊd
  3769. òGø˝ÙÄÊd
  3770. ò@˛ÄÊd
  3771. ò@˛ÄÊd ò?¯ˇÂd ò˛‰d ò˛ ‰d ò˛˛‰dòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldò˝
  3772.  „„àÓdò˝ 0˛DêÓdò˝
  3773. πÌÉ|·Äà†Ódò˝
  3774. õ„∞œ¿Ódò˝
  3775. ôŒ31(à†Ódò˝
  3776. o3aÄ(àêÓdò˝
  3777. ÕÅ„|·Å«àÓdòfldòfldòfldòfldòfldòfldòfld
  3778. òıÏdò˝> aÅ„˛Ïdò˝3 sÉ0˛Ïdò˝    3É|·ÉÇ0Ìdò˝    >mÅ„∞DÌdò˝    <?aÄ31D8Ìdò˝    63aÉ3aÄHHÌdò$籂œç±‚œ¥~    úò˝    33aÅ„|·ÇH8Ìdòfldòfldòfldòfldòfldòfldòfldòfleò¸     ¿‡@ Ógò¸ ¿¸ ¿`Ódò¸     Œ|˜9·Ä@@ Ódò¸    õqÉm∞@@ Ódò¸    ü`„m∞Ä@ Ódò¸    `3m∞Ä@ Ódò¸    a„9±ÄÑB Ódòfldòfldòfldòfldòfldòfldòfldòfldò˙ÄË@¡¬„Çıdò˙¿à@B&1Fıdò˙g<·ÄéHR@"Jıdò˙aô∞âHR@BÛ“ıdò˙gôâHR@Ç_ıdò˙ÕôÄâHRA Çıdò˙áå·Äâ8ÉéC‚√ıdòÛIJÚdòÙ˝Údòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldòfldò·ˇd
  3779. ò„Äd
  3780. ò„Äd
  3781. ò„ÅÅd"ò˙˝Äh¸˛5ÄÇAd"ò"˛˝Äà¸˛@ÄÑ!d%#ò#ô√ådòÊ3úÕ«„ô›À0qås9ÇN`Ïòàd%#ò"JBï)    JH%(îÑ$à®,HJRî§BPêD§ê    d%#ò"IÇNÜ/JHÂ&óÉ$à®ËxKfió§BLDºº=d%#ò"HBRï%(    JI%!î§àQ(@Jî$BBÄD†Ñ!d%#ò"KÉédúÊ2DÂ.ìÑPË0Iås    Å‹`DòÑ!dò˛ ÍÑ!dò˛¿Íá·d
  3782. ò„Äd
  3783. ò„Äd
  3784. ò„ˇˇd"ò˛–˛Ë l¸ÄÄk˝Äd ò˝˝à$¸ÄÄÅ˝Äd%#òwm«3∫    ñ`ég$»'    !Ä,¡Ÿ1¡úÄd%#òÑÖÖ)IPXêâ(%%H    % íê± âJRÄd%#òdù)IQ–â&%%F    % í ì°‡âyÇRÄd%#ò•)I¢PÄâ!    %"Å    % íî°â@BRÄd%#ò‰ù'1°–bâ.$¬é‡L솿â3ÅíÄdò˛ÙıÄdò˛ÙıÄd
  3785. ò„Äd
  3786. ò„Äd
  3787. ò„Ädò˛
  3788. ÇÄIÄ˝ˆÄdò˛
  3789. ΔÄ    Ä˝ˆÄd$òëí∞™c79é‡Ç›¿Œ„,ŒŒKôgpH…X˝Äd$òíR¿íîíPêTI!$î∞%))I%à    HI)`˝Äd$òíRÄÇtíLêTI!$ó†!))I=    HI)@˝Äd$òíRÄÇîîíBê(I!$î %))I!    HI)@˝Äd$òqéÄÇsâúê(E ¬ì ….8ôH8«@˝ÄdòÒ¸˚Ädò`Ò¸0˚Äd
  3790. ò„Äd
  3791. ò„Ädò$‚±7œ‚±7œ    ~^ú
  3792. ò„ÄdòÄËÄdòÄËÄdò„:    ñêËÄdòîëRX†ËÄdòóëRP¿ËÄdòî¢P†ËÄdòì°êíËÄd
  3793. ò„Äe
  3794. ò„Äg
  3795. ò„Äd
  3796. ò„Äd
  3797. ò„Äd
  3798. ò„Äd
  3799. ò„Äd
  3800. ò„Äd
  3801. ò„Äd
  3802. ò„Äd
  3803. ò„Äd
  3804. ò„Äd
  3805. ò„Äd
  3806. ò„Äd
  3807. ò„Äd
  3808. ò„Äd
  3809. ò„Äd
  3810. ò„Äd
  3811. ò„Äd
  3812. ò„Äd
  3813. ò„Äd
  3814. ò„Äd
  3815. ò„Äd
  3816. ò„ˇˇd
  3817. ò„Äd
  3818. ò„Äd
  3819. ò„á·d
  3820. ò„Ñ!d
  3821. ò„Ñ!d
  3822. ò„Ñ!d
  3823. ò„º=d
  3824. ò„ê    d
  3825. ò„àd
  3826. ò„Ñ!d
  3827. ò„ÇAd
  3828. ò„ÅÅd
  3829. ò„Äd
  3830. ò„Ädò·ˇdòfldòfldòfldòfldòfldòfldòfldòfldòfld òίˇd òίˇ¸d òÎ?¯ˇ˛d òÎ|¯d òÎq¯ˇ«d òΈ¯7Äd òΉ¯Äd òÎ˯ Äd òÎ˯ ÄdòÎ˲Δ0˛ ÄdòÎ˲f`˛ ÄdòÎ˲f¿˛ ÄdòÎ˲gIJ ÄdòÎ˲g˝ ÄdòÎ˲gIJ ÄdòÎ˲f¿˛ ÄdòÎ˲f`˛ ÄdòÎ˲Δ0˛ Äd òÎ˯ Äd òÎ˯ Äd òÎ˯ Äd òΉ¯Äd òΈ¯7Äd òÎq¯ˇ«d òÎ|¯d òÎ?¯ˇ˛d òίˇ¸d òίˇdòfldò$7±Cœ7±Cœ^~júòfldòfldòfldòfldòfldòfldòfldüflˇ‰üflˇÂÄflÄflfiˇ¸†è†É
  3831. d
  3832. °dONLNd'Ç6ñ(ë6Custom Remove Interface"°∂ ñ4ñ0°∂°∂
  3833. °dONLNd?õ~ß+H^Prior to Installer 4.0, the user had to hold down the option key to enable the remove feature.°dONLNdüß~≥* UBy selecting the Custom Remove pop-up menu item, the user can go to the Custom Remove°dONLNdı≥~ø•* window.ˇÇdˇ ˇˇˇˇd
  3834. d, Palatino
  3835. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3836.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú17°dONLNdQ~\∞(Y~
  3837. Figure 2-5°dONLNd QΩ\*)?The Custom Remove dialog†Ç†é
  3838. a6Üò>"OS2"OS2a6í≈ˇ’UÄΔ`ÄΔ`ÄΔ`øÌˇÔˇ˚ˇø`Äχ˛ů `0ÌÄ` øÌˇê˛ ÅÄ `0ˇ˙ø`ÄÌÉ1«èÅÄ |8Ò„1„`ÔÄ` øÌˇ
  3839. √3#ôòÅ fdb˛3Äˇ˙ø`ÄÏ„3Éôò fpaÛ33ÓÄ` øÌˇs1√ôò f8c33Ûˇ˚¯ø`ÄÏ30„ò fc33ÓÄ` øÌˇ32côò fLc33ˇ˙ø`ÄÏ·Ò¡èò f81Û1„ÓÄ`øÌˇ0Úˇ˚ˇø` ÄÏ0›` Äχ›`ÄΔ`≈ˇ‡ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ` ÄÔˇ¸⁄` ÄÔ⁄` ÄÔ⁄`ÄÔ¯ˇ¿`Ä¿˛>¯Ê¯0`Ä ˛3¯Ê¯`!Äcè?‡3?·„1‡˛Ê¯`    ÄfF330˚30¸Ê¯`%
  3840. Äg330>¸30¯Ê˛ÿ˛`& ÄcÜ3303?˝3Ê˛ÿ˛`% ÄaΔ33030˝3˛‡Ê˛    ÃxœÄ`& Ä&dΔ33031˛3#@Ê˛˛Ã¿`'Ä√„É30331„¡‡˛Ê˛    ¸Ãÿ`ÄÔÊ˛    Ã¸Ã¿`ÄÔÊ˛    Ã¿Ã¿`ÄÔÊ˛    ÃƒÃ¿`ÄÔÊ˛    ÃxœÄ`ÄÔˇ˛Ê¸ ˛`ÄÔˇ˛Ê¸ ˛`
  3841. Ä“¯`ò>SOÑ2SOÑ2í6√
  3842. Ä“¯uU
  3843. Ä“¯0` Ä—¯ˇ¿`ÄΔ` Ä» ĸ ÿ` Ä( ĸ ÿ`Ä1íΔt¨«`„ôÿ»ò‡ÿ`
  3844. Ä    JT    !$±(êîÜ˝% ÿ`Ä    z    Á$°ÊêóÑ=%%= ÿ`Ä)BT        $°êî!%"! ÿ`Ä…1í«†Œ`„$¬‡ÿ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`
  3845. Ä…ˇ¯` ÄÀ` ÄÀ`įœ `    Ä@˛PQŸ`    Ä @IJàÇŸ!`Ä
  3846. @PU@QEQ@fi@à`Ä    @
  3847. àààĆàÇàÇ fiÄH`ÄÄ@DD@QAQ@fi·Ë`Ä@@àä®àÄ(àÇààdžfi!`ÄÄ@@D@A˛›!`Ä    @àÇÄàÄààÇÄàÇ fi!`Ä
  3848. @PD@PPA@Q@fi?`Ä @Ä“`į—`ĸ
  3849. —ˇ¯` ÄÀˇ¯` ÄÀ` ÄÀ`į—ˇ`
  3850. Ä@Ä0å÷Ü`
  3851. Ä @ ¿Ä÷Δ` Ä
  3852. @ Õ≥„ï|ÿΔ` Ä    @ Œ31åÃÃÿ0Δ` ÄÄ@å31åÃÃÿΔ` Ä@@ 31åÃÃÿΔ` ÄÄ@ 31åÃÃÿ8Δ` Ä    @ 31åÃÃÿΔ` Ä
  3853. @ 30ÃÃ|ÿˇΔ`Ä @˚ ◊ˇÜ`į˚å÷`Ęx÷ˇ¯` ÄÀ` ÄÀDH`ò>ÑOµ2ÑOµ2√6Ù ÄÀuUį—ˇDH` Ä@ ˛ÄòflÖ` Ä@  ˛˛@flƒDH`$Ä@#«ôòÒ∂f|>è<ëçû„≈`$ġ‡@&côôΔΔff ΔûŒ3„0ƒDH`$Ä@@O» ¶côôáÜffåΔëÃ3„≈`$Ä Ä@    Á„ôôáffÃΔ˛Ã?„ƒDH`$Ä@ÊôôáÜffÃΔ˛Ã0„8≈`$Ä
  3854. @f#ëôÜΔffÃΔÃåÃ1„ƒDH`$Ä@#¡ü‡ÒÜff>áÜ ˇÃ„ˇ≈`Ä@¯⁄ˇÑDH`į¯FŸ`ÄÙ<ŸDH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝
  3855. Ģò0¿‹Ö`Ä˝Ä¿0ŸƒDH`Ä˝ ÑÄ¡ò>6œá¿fi≈`Ä˝ HÄ¡ôò3#8Ãÿfi0ƒDH`Ä˝ 0ÄÒôò30Ãÿfi≈`Ä˝ 0Ä¡ô¯330ÃÿfiƒDH`Ä˝ HÄ¡ôÄ330Ãÿfi8≈`Ä˝ ÑÄ¡ôà330ÃÿfiƒDH`Ä˝ Ä¡ò30ë¿fiˇ≈`Ä˝į¿›ˇÑDH`Ä˝ˇÄ˘¿‹`ÄÚÄ‹DH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝    įΔ?f€Ö`Ä˝    Ä¿Δ f€ƒDH`Ä˝
  3856. Ä¡Á√ΔÃ<f`‹≈`Ä˝
  3857. Ä¿Δfg Ff¿‹0ƒDH`Ä˝
  3858. ÄΔff >gÄ‹≈`Ä˝    Ä¿ΔgÊ fg€ƒDH`Ä˝
  3859. Ä¿Δf fgÄ‹8≈`Ä˝
  3860. Ä¿Δf& ff¿‹ƒDH`Ä˝
  3861. įfcΔ >f`‹ˇ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀ`ò>µOÊ2µOÊ2Ù6%Ä˝ˇÄ‘ˇDHuUÄ˝
  3862. ů‡ ¿‹Ö`Ä˝
  3863. Ä`Ä ¿‹ƒDH`Ä˝
  3864. Äa„1„·áåË≈`Ä˝
  3865. Äc3c31àÃÿ‹0ƒDH`Ä˝
  3866. Äc3√31áÃ‹≈`Ä˝
  3867. Äc3ÉÛ1åÇ‹ƒDH`Ä˝
  3868. Äc3√1åÃ‹8≈`Ä˝
  3869. Äc3c1åÃÿ‹ƒDH`Ä˝
  3870. Äa„1„1áÃˡ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀ`Ä˝ˇÄ‘ˇDH`Ä˝ÄÄ@?<|⁄Ö`Ä˝Ä¿¿ bf⁄ƒDH`Ľķ«á `f⁄≈`Ä˝ÄÛ»Ãå`f⁄0ƒDH`Ä˝Äæ«Ã `|⁄≈`Ä˝ÄúÃà ``⁄ƒDH`Ä˝ÄàÃà ``⁄8≈`Ä˝ÄÄÃÃåb`⁄ƒDH`Ä˝ÄÄ«« <`⁄ˇ≈`ĽĔˇÑDH`Ä˝ˇÄ“` ÄÀDH` ÄÀ` ÄÀDH` ÄÀˇ¯`į—ˇ`Ä@ Δ31Äps⁄Ñ`Ä @ ΔÄ»√⁄ƒ?` Ä
  3871. @ œ33ÿ¿ÒÁôòÒ≥¿flƒ!` Ä    @ Δ31å¿·ò√ôΔ`fl0ƒ!` ÄÄ@ Δ31å¿qò√ò˘Ü`flƒ!` Ä@@ Δ31å¿9ò√ôôá‡fl≈·Ë`ÄÄ@ Δ31å¿ò√ôôÜfi8ƒÄH` Ä    @ Δ31å¿ôò√ëôÜ flƒ@à` Ä
  3872. @É30«¿p¡ü‡˘É¿flˇƒ!`Ä @¸¿÷ˇÑ`į˝¿’ `ĢĒ` ÄÀ`
  3873. Ä…ˇ¯`ÄΔ`ÄΔ`ò>ÊO2ÊO2%6VÄΔuU(ĸ˚∞!į˘»ÄÓ Äį¬"¸`'ĸÄ˚ ÄÄ"
  3874. )ÌÄÄIJ$¸`*ĸY“„¿»ôì8ò@*Ì òŒcÉ∑ò@"(¸`*ĸJê• %ê§§LÌ $•$îÑ$s¬0¸`)ĸIò ì°‡Â짺 äÏ
  3875. ºΩÙÉ<
  3876. "(¸`*ĸàTî•"$à!    Ì †°$ÑÄî ä"$¸`+ĸ í„ò¿‚ì∏ò@pæ#ËÄÓ ò¬cáò@q¬"¸`įįÄ⁄`Ä¯Ä˘Ÿ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`ÄΔ`
  3877. Äå ` ”`
  3878. ÄÄ
  3879. Ä”`Äú{›„ûÁ< ‹ˆ¿‘`ÄUY∂¡ç∞Ãm∂ ÕáÖÎUÍ`
  3880. Äæqç≥Ãm∂ ÃÁ”`Äç∂Ãm∂
  3881. å7ÄÏÍ`ÄÕ≥Δg6
  3882. Ê¿‘`Äfl˚?ˆˇ¸`Ä◊¿ˆ¿˝`Äfl˚Ĉ@˝`Äÿı ˝`Äfl¸ı ˝`Äψˇ˙˝¿0˝ ˝`!Ä̈ ¸˝`0˝ ˝`Äψ˙˝ffx˝ ˝`!ÄÌ ˆ¸˝ff0˝ ˝`ÄÏ ˆ˙˝ff0˝ ˝`)ÄÌ A¸˝ff0˝ ˝`&ÄÏ ˛ Ä˙˝ff0˝ ˝`)ÄÌ PA¸˝ff0˝ ˝`&ÄÏ  "" àÇ ˙˝√Ê˝ ˝`&ÄÌ A@¸¸`˚ ˝`ÄÏ  *  à¢Ä˙ı ˝`"ÄÌ ˛Q@¸ı ˝`ÄÏ   " à" ˘Äˆ@˝`"ÄÌ AA˚¿ˆ¿˝`ÄÏ ˘˘?ˆˇ¸`ÄÌ ˘Í`ÄÏ 
  3883. ˘Ë`Ä̈Í`Äψ Ë`Ä̈ˇÍ`ÄΔ`Ä˙˛ˇÄÎÍ`ò>OG2OG2V6ÜĢ ˛@”uUÄ˙ ˛@ÎÍ`Ģ ˛@”`Ä˙ ˛@ÎÍ`Ģ ˛@”`Ä˙ ˛@˘ˆˇÍ`Ģ"˛@˘ˆ ˘ıˇ¿˝`"Ä˙ ˛@˘ˆ¸ıˇ˝`Ģ ˛@˘ ˆ˙ıˇ¯˝`#Ä˙˛ˇÄ˘ ˆ¸Ĉ|˝` ÄÏ  p¿ ¯¿˙?ˆˇ˝`#ÄÌ »¿ ø¿ˆfi˝` ÄÏ  ¡ôô„èÄëÄ˙ĈN˝`"ÄÌ ·ôòΔL¿ÃÃõ¸ı.˝`ÄÏ  qôòΔ ¿ÃŒ˙ı.˝`&ÄÌ 9ôòΔ ¿Ã«¸˛¯˘.˝`.Ä˚ ∏˙  ôòΔ ¿Ã√û˙˛Ã˘.˝`6ĸ `§˙ ôôΔL¿Ã…õ¸˛    Ãxˇáå«Ä.˝`/Ä˚
  3884. ¶3sòÓ¢˙  q˛c忯«Ä˙˛˚ÿ.˝`,ĸ    !II%    ¢˙ ˆ¸˛¯¸Ã¿.˝`+Ä˚'AI$…¢˙ ˆ˙˛ø˛Ãœ¿.˝`,ĸ)II$)§˙ ˆ¸˛ÿ˝Ã˛.˝`+Ä˚'1Hô…∏˙ˆ˙˛Ã˛Ãå@.˝`#Ä̈ ¸˛    ÃxëèÄ.˝`Äψˇ˙ı.˝`Äfl¸ı.˝`Äÿı.˝`Äfl¸ĈN˝`Äÿ¿ˆfi˝`Äfl¸?ˆˇ˝`ÄÿĈ|˝`Äfl¸ıˇ¯?ˇ‡Äÿıˇ `ÄfiU˚ıˇ¿ `    Ä»'`    Ä»$`    Ä»$`    Ä»$`    Ä»$`    Ä»$`    Ä»'Ò`    Ä»!`    Ä»!`    Ä»!`    Ä»!ˇ`    Ä» `≈ˇ‡Δˇ‡†è†É
  3885. d
  3886. °dONLNd$ê~ú(ô~WThe Custom Remove window layout looks very similar to that of Custom Install.  The main°dONLNd|ú~®.* _difference is that the items in the Custom Install list which are not removable are dimmed, and°dONLNd‹®~¥'* &the Install button is titled “Remove”.
  3887. °dONLNdÃ6‡y(€6'Selecting the Target Application Folder"°∂ ‡4‡0°∂°∂
  3888. °dONLNd+Â~Ò&+HaIf the scriptwriter allows the user to select a target folder, a modified Standard File dialog is°dONLNdçÒ~˝* Zshown when the user clicks the Select Folder button.  The Select Folder dialog is shown in°dONLNdË˝~    Æ* Figure 2-6.ˇ (dˇ ˇˇˇˇd
  3889. d, Palatino
  3890. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3891.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú18°dONLNdQ~\∞(Y~
  3892. Figure 2-6°dONLNd QΩ\)?The Select Folder dialog°d WORDÿv
  3893. bÉ:˘ò0˝`‘‡˝f‘€bÉ9¯”ˇ‡” ” ‘ˇ ‘ˇ `’ `’ `’ `’ `’ `’ `’ `’ `’ `’ `0Δ`3¿8Ï     `0Δ˝3˛`Ï "`1·«ÅÁ√¿g√è3<«èÄÒ„6¿Ô "`˛3#Δf`ffF#3#Ãÿc˛38¿Ô !`˛3Δf`fg3Ãÿc˛30Ó !`?3ÛΔg‡fcܲ3Ãÿc33?0Ó !`03ΔffaΔ˛3Ãÿc3300Ó "`13#Δf fdΔ˛3    Ãÿc3310¿Ô "`1·¡Äfc¿fcÉ3 «å¿a„0¿Ô `’ `’ `’ `’ `’ `’ `’ `’ `’ `’ `˙Òˇ¿Ó `˙Ò@Ó `˙Ò@Ó `˙Ò`Ó `˙Ò`Ó `˙¿`g¿`Ó `˙˛    `f``Ó '`˙?ˇ<8œè|f`?‡`¯ Äf¯ '`˙@áûFdÃΔ32ff`¿`¯ Äfà)`˙@Öˆ>`ÃΔ38fÊ`Ä`˙
  3894. ˇ¸9„õÁû9fà*`˙PÑÊf`ÃΔ3ff``˚z6[33eòfà*`˙@ÑFf`ÃΔ3ff``˚Ÿˆqò~à*`˙?ˇfdÃΔ3&ff``˚@õ6òfà*`˙>8Ã√fg¿`˚òfà`˙Ò`˙
  3895. ˇ¸[33Mòfà`˙Ò`¯ Ûõ1û9òf¯ `˙Ò`Ó `˙Òˇ‡Ó `˘Òˇ‡Ó `’ `’ `’ `’ `¡˛Ù `@ÁÙ `@ÁÙ `C¿ËÙ `D ËǢˇ‡ 
  3896. `Oˇ‡x¿¯¿ÒBĢ 
  3897. `Hÿ¿¿Ò"¯  `Hﯫġôʜ۠¯ `H˝Ã¿¡ò«ôÛxz¯  `H¸˛Ã¿ÒòΔúÛB¯ &`H˛Ãœ¿¿ΔéÛB†Ä %`H˝Ã¡òΔáÛB˛ %`H˝Ã@¡òΔìÛ¬ä
  3898. ( &`Hï¯«Ä˘òféÛ `H¿¿ÏÄàà `Oˇ¿¿Ïˇ˛ `@Áˇ˛à `@ÁÄ `@ÁĆä
  3899.  `@ÁIJ¸ `@ÁIJĽ `C¿ËIJ¸ `D Ëį $ `Oˇ‡x¿˝`<ĘÄĢ $ `Hÿ ò˝‡fĘ̎‡  `Hﯫå<`fĘÄÙ `H˝Ã    Œëúf`fĘÄÙ  `H¸˛Ã    «èòf`fĘÄÙ  `H˛Ã
  3900. œ√ôôò~fĘÄÙ `H˝Ã    ôôò``fĘÄÙ `H˝Ã    IôôòbffaĘÄÙ %`Hﯫáèò<f<aʡ˛˘ˇ‡ `H¿¿ÏàäĢ `Oˇ¿¿Ï""¯ `@Áà䯠`@Á""¯ `@Á
  3901. àäÄ ˛ `Êˇ    "" ¿ ˛ `Êˇàä «áû<| `|?Áˇ"" ÃÃõ ff `{flÁˇàä ÃŒ ff " `pᡡ3ˇˇ9Ôˇ"" œ« ff " `wˇÔ3ˇˇ?ˇˇ?Ôˇàä Ãû ff %`wˇÔ33è√ɫڡ"" ÃIõ ff $`wˇÔ˝36Á9ôôõÚˇàäááÜ<| !`wˇÔ˛3?9ôôèÚˇ""˙`  `wˇÔ˝3>g9ôô«Úˇàä˙` `wˇÔ˝3>g9ôô„Úˇ""¯ `wˇÔ˝36g9ôô≥Úˇà䯠 `wˇÔ33èô√ô«Úˇ""Ģ `wˇÔˇ??Ρà䢡‡ `pˇ??Ρ""Ù `ÊˇàäÙ `Êˇ""Ù `ÊˇàäÙ `@Á""Ù `@Áà䢡‡ `C¿Ë""Ģ `D ııà䯠&`Oˇ‡x¯xÄxèįxˆ""˚ '`H˛Ã    ¿Ã ÿÃòˆà丠)`H˛Ã    ¿Ã ÿÿòˆ""ˇ¯ )`H˛Ã    ¿Ã ÿÿ!òˆàä )`H¸¯¸ÄÃèį¿!òˆ""àÒôÇ )`H˛Ãà ˛¿Aòˆàä…ôôÇ )`H˛Ãà ˛¿Aòˆ""ÈôôÇ )`H˛Ã     à ¿¿ƒÅòˆàäy˘ôÇ )`H˛Ã    Ãx Ä¿xÄˆ""9ÅôÇ `HÈàäâô `OˇÈ""Ò˛ `@Áà丠`@Á""¸ˇ¸ `@Áà䯠`@Á""¯ `@ÁàäĢ `C¿Ë""˘ˇ‡ `D ËàäÙ &`Oˇ‡¯˝xÃΔ¿ ‡˛""Ù &`HÃ˝ÿ¿ 0˛àäÙ '`HÃxˇáÄï¯ÃpÒÊ<|å|xÿ0˛""Ù %`H˝Ã¿˝Ã…Δff ˛Ã‡0˛àäÙ &`H˝Ã¿¸˛Ã¿¯Δffå˛Ã¿`˛""Ù &
  3902. `HøÃÿ˝Ã ¡òΔff Ãø¿¿˛àäÙ &
  3903. `HÿÃÿ˝Ã ¡òΔff Ãÿ¡Ä˛""Ù %
  3904. `HÃÃÿ˝Ã
  3905. …òΔff ÃÃ√˝àäÙ '`H¯xëÄï¯Ãp¯f<få|x√˛""Ù `H˚¿¿ÒàäÙ `Oˇ˚¿¿Ò""Ù `@ÁàäÙ `@Á""Ù `@ÁàäÙ `@Á""Ù `@Áà䢡‡ `C¿Ë""Ģ `D Ëˇ˛¯ `Oˇ‡¯˛‡Ô¯ `HÃ˛0Ô¯ #
  3906. `Hß„‡1„0Ò¬<˝¿ #
  3907. `HÄ30330ÒBb˝¿ $
  3908. `HÃ√30„30ÒB`<|8x¿ $
  3909. `HÃ√3031‡ÒB`Ffdÿ $
  3910. `HÃ√30330Òxz`>f`ÿ $
  3911. `HÃ√30330Ò `ff`¸¿ $
  3912. `H¯¡„‡·„0Ò"`ff`¿¿ `HÏBbffdƒ¿ `OˇÏÇ<>f8x¿ `@Á¯ `@Á¯ `@Á¯ `¡˛¯ `·Ģ `‡˘ˇ‡ `’ `’ `’ `·¯ˇ¯ `·¯ˇ˛ 
  3913. `·˜ˇ `·¯Ä `·˘ˇ„Ä `Êˇ¸=Ģ¿ `Ê9¯    ¿ `Ê:¯¿ `ÂÄ:¯¿ `ÂÄ:˛¸¿ +`¸0ë‡0`¸Ä:ò¸¿ -`¸ 0#0˛`¸Ä:ôÒ¿ -`¸1·«Å≥3„„1√«òÒ· ¸Ä:˛ôò¿ ,`¸˛3#≥˝3$côôí@¸Ä:˛ôò¿ ,`¸˛3Û˛3„ôô¿˚Ä:ôô˘ò¿ +`¸?3Û˝3côò‡˚Ä:ôôÅò¿ +`¸03˝3côòp˚Ä:ôôâò¿ +`¸13#˝3&côô0˚Ä:˛    ÒÒò¿ +`¸1·¡Ä3„„1√·òÒò‡˚Ä:˛Ä˝¿ `ıÛÄ:˛Ä˝¿ `ıÛÄ:¯¿ `ÂÄ9¯    ¿ `Ê=Ģ¿ `Ê˘ˇ„Ä `Êˇ¸¯Ä 
  3914. `·˜ˇ `·¯ˇ˛ `·¯ˇ¯ `’ `’ `’ `’ `’ `’ `’ `’ `’ `’ ‘ˇ ‘ˇ ” ” ”ˇ‡
  3915. d
  3916. °dONLNd$E~Q)(N~dTo select a target folder using the Select Folder dialog, the user selects the folder or disk in the°dONLNdâQ~].* flist, and then clicks the Select button.  If no items are selected, clicking the Select button chooses°dONLNd]~i** _the folder or disk whose contents are showing in the list.  The Open button is enabled whenever°dONLNdPi~u$* fa folder, disk or alias is selected in the list.  If the folder or disk is not a valid target disk the°dONLNd∑u~Å“* NSelect button is disabled, such as for a locked floppy disk or a sever volume.°dONLNdâ~ï#*\The Installer always recommends a target application folder to the user when first launching°dONLNdcï~°'* athe Installer.  The user is shown the contents of the folder when first opening the Select Folder°dONLNd≈°~≠* adialog.  If the folder does not already exist, the folder is created so the user can either click°dONLNd'≠~πÉ* 8Cancel or Select and maintain the recommended selection.
  3917.     °dONLNd`√~Œö*NOTE
  3918. °dONLNde—~›,*`We suggest that scriptwriters place the application and associated files and folders directly in°dONLNdΔ›~È* Zthe recommend target folder.  This provides a visual association between the folder in the°dONLNd!È~ı-* `Installer’s dialog and the application folder of the same name that is created on the hard disk.°dONLNdÉı~±* EThis also allows an existing application to be updated more easily.  ,
  3919.  
  3920. Zapf Dingbats
  3921.     °dONLNd»˜±∏(˛±u
  3922. °dONLNd 6-'((6Selecting the System Volume"°∂ -4-0°∂°∂
  3923. °dONLNdÊ2~>+HWScriptwriters can allow the user to change the recommended system volume when using the°dONLNd>>~J* ^application folder interface.  A flag in the preference resource determines if this feature is°dONLNdùJ~V(* _enabled.  The Installer initially recommends that system files be installed on the boot volume.°dONLNd˛V~b* [The scriptwriter can override this recommendation using the Setup Function described in the°dONLNdZb~n\* 2section “Using the Installer Preference Resource”.°dONLNdçv~Ç*VThe user accesses the Select System Volume dialog by holding down the Option key while°dONLNd‰Ç~é* Zclicking the Select Folder button. The Select System Volume dialog is shown in Figure 4-6.ˇvdˇ ˇˇˇˇd
  3924. d, Palatino
  3925. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3926.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú19°dONLNdQ~\∞(Y~
  3927. Figure 2-7°dONLNd QΩ\C)?The Select System Volume dialog†Ç†é
  3928. _~⁄íò$Ä∂’ Ä∂’ _~¥íflˇ˛cćGćü‡ˇí ü‡ˇü‡ò·êò·êò·êò·êò·ê˛ò·ê@ò·ó1ò·íRò·õ¡ò·îÇò·úpò·ê‰ò·ò·ò·ò·ò·ò·%òkl Ä¿@¿@H˛ò·%ò"Ş$ @@@@@˛ê%ò ë‹Œ¡Ÿ1¬ $8¡∏ÓbLpgqÅÃLg1¡Ÿ“˛ò%òí    ) âJQ$% •RêîÇJBRíJBJ˛ô3%òëâÈ âyÅQ$%‡§ƒr^êîÇK¡û^ÇzBIò˛ôò%ò"êI     â@@°$%§$íPêîÇJPPíBBHT˛ê%#òsÑ… â3İ$8¿•¬rLpdÅIÉåLa1¡Àí@ëê ò‰ò ò`‰ñ1ò·ëΔò·êò·ùò·ê
  3929. ò·ëò·ëò·ëò·ùò·ìò·î„ò·õò·î    ò·íò·êò·ëêò·êòò·õÄ òÙÔˇÄôô
  3930. òÙÄÄê
  3931. òÙÄÄö˛
  3932. òÙÄ¿ë„#ò¿˛>0ÄÄ@¿ ︿ê#ò ˛3Ä¿¿˛¿ Ãø¿ê%òcè?‡31ΔfÄ·«áÒ„√èÄÃÃ˛ˇ‡¿ê˘%òÜfF33033&ΔÄÛ»ÃôòΔfL¿ÃÃ˛¿¿ê%òΔg33033áÄÄæ«ÃòΔg ¿¸Ã˛?Ä¿ëê%òÊcÜ?3031«ÄúÃÃòΔcå¿ÃÃ˛¿ò%òfaΔ03030ÁÄÄàÃÃòΔaÿÃÃ˛¿ò%òfdΔ13032fΔÄÄÃÃôòΔdÿÃÃ˛¿ò#ò√„É30>1ΔfÄÄ««òc√å¿Ã¯¸¿êò˛`¯Ä¿õmò`¯Ä¿õmò¿¯Ä¿õm
  3933. òÙÄ¿õm òÙÔˇ¿õm
  3934. òÙˇ¿õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò·õmò̯ˇ¯õmò̯ˇ˛õm
  3935. ò̘ˇõmò̯Äõmò¯˘ˇ¯˘ˇ„Äõmò¯`˘=Ģ¿õmò$’∂˚ ’∂˚ ¥~⁄íò¯@˘9¯    ¿ûcò¯Ä˘:¯¿êGò¯Ä˘:¯¿ëò¯Ä˝0:˛„˛¿í ò¯ÄIJ0:˛30˛¿ü‡ò¯ Ä0:˛3`˛¿êò¯ Äôô30:˛3¿˛¿êò¯ Äôò30:˛3IJ¿êò¯ Äôò?0:˛3¿˛¿êò¯ Äôò00:˛3`˛¿ê˛ò¯Ä˛ô10:˛30˛¿ê@ò¯ Äôé0:˛„˛¿ó1ò¯Ä˘:¯¿íRò¯Ä˘:¯¿õ¡ò¯Ä˘:¯¿îÇò¯@˘9¯    ¿úpò¯`˘=Ģ¿ê‰ò¯˘ˇ¯˘ˇ„Äò·ò̯Äò·
  3936. ò̘ˇò·ò̯ˇ˛ò·ò̯ˇ¯êò·òò·ô3ò·ôòò·êò·ëêò·òò·ñ1ò·ëΔò·êò·ùò·ê
  3937. ü‡ˇëü‡ˇëććflˇÛ†è†É
  3938. d
  3939. °dONLNd+‚~Ó"(Î~\The user can change the currently selected system volume by choosing a different volume from°dONLNdàÓ~˙(* ]the pop-up menu.  Only valid system volumes (those that contain blessed folders) are shown in°dONLNdÊ˙~™*     the menu.
  3940. °dONLNd62˘(-6Adding a Splash Screen"°∂ 2420°∂°∂
  3941. °dONLNd7~C+H_The first screen to be displayed when the Installer is launched is found in the script.  If you°dONLNdgC~Oö* ?would like to provide your own splash screen, simply include a ,
  3942. Courier°dONLNd¶CöOæ(Lö'PICT'°dONLNd¨CæO)$ resource named °dONLNdºCO,)H“Splash°dONLNdƒO~[†(X~Screen”°dONLNdÀO†[)"X  with a resource ID greater than 1024.  The Installer loads the picture from the script°dONLNd$[~g)(d~`and displays it, along with an OK button in the lower right corner to dismiss the splash screen.°dONLNdÖo~{ø*HYou can also have a color splash screen.  In addition to the PICT named °dONLNdÕoø{ (xø“Splash Screen”,°dONLNdfi{~á˙(Ñ~include a color PICT named °dONLNd˘{˙á_)|“Color Splash Screen”°dONLNd{_á&)e0.  If the screen has a depth of 4 bits per pixel°dONLNd?á~ì-(ê~bor greater (16 colors/grays or more) then the Installer will use this PICT instead.  Note that you°dONLNd¢ì~üÜ* =should use the default system color palette for best results.°dONLNd‡ß~≥,*aCreate a picture using a drawing or painting program.  You will want your picture to be no bigger°dONLNdB≥~ø5* (than 220 (height) by 433 (width) pixels.°dONLNdk«~”+*\The AppleGaramond font is recommended for titles and the help screen fonts included with the°dONLNd»”~fl* `SDK for text.  Since you cannot be sure your chosen fonts will always be available, it’s best to°dONLNd)fl~Î* Zcreate a bitmap picture when using fonts other than Geneva 9, 12, Chicago 12 and Monaco 9.°dONLNdÑÛ~ˇ*`If necessary, convert the picture to a bitmap and copy it into the clipboard.  Paste the picture°dONLNd¡~ * \from the clipboard into a newly created ResEdit file.  This should create several resources,°dONLNdB ~≤* including a °dONLNdN ≤÷)4'PICT'°dONLNdT ÷)$B resource.  Delete all of the resources you’ve created except the °dONLNdñ ('PICT'°dONLNdú )$.°dONLNdü~#œ( ~Save the ResEdit °dONLNd∞œ#Û)Q'PICT'°dONLNd∂Û#    )$ file.°dONLNdΩ+~7÷(4~DeRez the ResEdit °dONLNdœ+÷7˙)X'PICT'°dONLNd’+˙7¯)$5 file using MPW.  We use the following DeRez command:°dONLNd ;êG.(DêEDeRez 'ResEdited-Splash' -only PICT {MPW}RIncludes:Pict.r >> Script.r°dONLNdRJ~V[(S~/This command appends the Rez definition of the °dONLNdÅJ[V)›'PICT'°dONLNdáJVÎ)$ to the end of your script,    Monaco
  3943.     °dONLNd°JÎUÒ)l.
  3944. °dONLNd£^~j=(g~+Open the script file you just appended the °dONLNdŒ^=ja)ø'PICT'°dONLNd‘^aj)$* to, go to the end, change the name of the°dONLNdˇj~v¢(s~'PICT'°dONLNdj¢vã)$8 resource (or give it a name if it doesn’t have one) to °dONLNd=jãv’)È“Splash Screen”°dONLNdLj’v.)J, and ensure that its°dONLNdbv~Ç"(~^ID is greater than 1024.  Your script now contains the picture in a format Rez can handle when°dONLNd¡Ç~é0* )building the script into resource format.ˇ!édˇ ˇˇˇˇd
  3945. d, Palatino
  3946. .+~*C  H  A  P  T  E  R      2,     Helvetica
  3947.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú20
  3948. °dONLNdQ6efl(`6Providing User Help"°∂ e4e0°∂°∂
  3949. °dONLNdj~v+HVClicking the Help button in the Installer window opens the Installer Help window which°dONLNdkv~Ç* ]displays PICTs stored in the Installer or script file.  The Installer Help window is shown in°dONLNd…Ç~éÆ* Figure 2-8.
  3950.     °dONLNd’ñ~°∞*
  3951. Figure 2-8°dONLNd‡ñΩ°")?The Installer Help window†Ç
  3952. §~µ1ò8‡@Ò‡GÒ˙§~µ1ÀˇÄÀ¿À¿À¿~ˇÔÏˇ˝͡˛¿Ä ÎÄÁ¿~Ä/ÏˇÄ͡˛¿Ä ÎèË¿~Ä/Ïˇôôò͡˛¿Ä ÎôôòË¿~Ä/Ïˇüôò͡˛¿Ä ÎòòË¿~Ä/Ïˇòôò͡˛¿Ä ÎèË¿~ˇÔÏˇÄ͡˛¿ ÊÄË¿À¿À¿Àˇ¿
  3953. ˆˇ¸◊¿
  3954. ˆˇ¸◊¿
  3955. ˆˇ¸◊¿
  3956. ˆˇ¸◊¿
  3957. ˆˇ¸◊¿
  3958. ˆˇ¸◊¿(ˆˇ ¸˙Ä@˝ ˛Ć˝@˜¿&ˆˇ ¸"Ä@¸ ˝†˛ˆ¿,ˆˇ"¸"«EñNcºÂ9B r)Á=e8‡¨wúß=9`rœNX‰˘¿,ˆˇ"¸#(ÅFYQîEÉ,ä*(†ñE≤džëEêã$Qe˘¿,ˆˇ"¸"/Ç$Q_ı}(âJ/∞}¢¬ßëEä$QEĢ¿,ˆˇ"¸"(‰QPëA(âJ( A¢2"®ëEä$QD`˘¿,ˆˇ"¸"(QPë5A(àähA¢&©ëEä$QD$˘¿,ˆˇ"¸"'ÑûO ’=»pâß∏
  3959. <¢·ö¶ç9s√NEƒ˘¿ˆˇ¸˝˚Òı¿ˆˇ¸˝˚Òı¿
  3960. ˆˇ¸◊¿˚ˇ˜˝ˇ¸◊¿˚ˇ«˝ˇ¸◊¿˚ˇá˝ˇ¸◊¿˚ˇ˝ˇ¸◊¿¸ˇ˛˝ˇ¸◊¿¸ˇ¸˝ˇ¸◊¿¸ˇ¸˝ˇ¸◊¿¸ˇ¸˝ˇ¸◊¿¸ˇ¯˝ˇ¸◊¿˝ˇ¯y√˝ˇ¸◊¿˝ˇ¿˛ˇ¸◊¿˝ˇÄ˛ˇ¸◊¿ ˝ˇ˛˛ˇ¸Û¸@Ä˙¯¿.˛ˇ˛˛˛ˇ
  3961. ¸>Ä6˝ Ä˙¯¿3˛ˇ¸˛?˛ˇ
  3962. ¸0ÄÄ6˝yÀ1œNr¢„ú≥,«,y√÷8˘¿3˛ˇ¸˛?˛ˇ
  3963. ¸0xÏa∂;œ6˝",»$P
  3964. ¢"Ã≥(≤äD˘¿3˛ˇ¯˛˛ˇ
  3965. ¸<
  3966. åaªaÅ∂˝ë"(â‰PzîÙ"à¢/¢ã|˘¿1˛ˇ¯˛˝ˇ
  3967. ¸0}Δ¡≥qè∂˝ë"(ä$Päî"à¢("à¡@˘¿1˛ˇ¯˛˝ˇ
  3968. ¸0ÃÊÅ≥9ô∂˝S"(ädPöà"à¢("òA@˘¿1˛ˇ¯˛˝ˇ
  3969. ¸0‹cÅ≥õ∂˝M»â£NjàÛúà¢'¢kÄ—<˘¿˛ˇ¯˛˝ˇ
  3970. ¸>m√≥pÕ∂ıÓ¿˛ˇ¯˛˝ˇ¸˝ Ó¿˛ˇ¯˛˝ˇ¸˝‹¿˛ˇ¯˛˝ˇ¸◊¿˛ˇ¯˛˛ˇ¸◊¿˛ˇ¯˛˛ˇ¸◊¿'˛ˇ¸˛?˛ˇ¸Ó@˛ ˝0˝0`˛¿&˛ˇ¸˛˛ˇ¸Ì ˝@˝0`IJ¿.˛ˇ¸˛˛ˇ¸ÛYe9eNy¿Á;—î‡Á(D‰T(ßYÁ`¿.˛ˇ˛˛˛ˇ¸ÛeñEñA"!ëYH∞EX(†°dà°ê¿.˛ˇ˛˛˛ˇ¸ÛEEO#·àë
  3971. £—H†)P%'°D౿,˝ˇ˛˛ˇ¸ÛEEQ"hë
  3972. §QH†)P%(°Dàç¿,˝ˇ˛˛ˇ¸ÛEES"(ëD—H†–")°DàÖ¿-˝ˇÄ˛ˇ¸Û
  3973. y‰9‰M·«ƒCPG „P"&ùDg9¿˝ˇÄ?˛ˇ¸ÚAı ˆ¿˝ˇ¿˛ˇ¸ÚAı@ˆ¿˝ˇ‡˝ˇ¸◊¿˝ˇ˝ˇ¸◊¿˝ˇ¸«˝ˇ¸◊¿
  3974. ˆˇ¸◊¿
  3975. ˆˇ¸◊¿
  3976. ˆˇ¸◊¿
  3977. ˆˇ¸◊¿
  3978. ˆˇ¸◊¿
  3979. ˆˇ¸◊¿
  3980. ˆˇ¸◊¿
  3981. ˆˇ¸◊¿
  3982. ˆˇ¸◊¿
  3983. ˆˇ¸◊¿
  3984. ˆˇ¸◊¿
  3985. ˆˇ¸◊¿ˆˇ¸x˝ ∞„¿(ˆˇ¸¿ ∞˙@˝‡`˙¿,ˆˇ¸É3ºÛf
  3986. ±fiy∞˝@@˛˛à˙¿0ˆˇ&¸É6õª
  3987. ∞XÂìé9ÛÅŒN;¡÷8Îß9fiàúß˝¿1ˆˇ'¸É7õ3
  3988. õå}∞dTPEDBQAE    (DààǻIJ¿1ˆˇ'¸É3ôõ3
  3989. ôÃÕ∞DÙWÿ
  3990. EDC_A}    ( DàUèIJ¿0ˆˇ&¸√qôõ3
  3991. òÛ∞ET
  3992. ED@–PA—A    (DàU"à˝¿0ˆˇ&¸y∑ Û3
  3993. õÜm∞E4TE0D@PPAQA    (Dà"&à˝¿&ˆˇ¸ÛD◊ì‹8–3ÉèO8√û<È'8Ü"áIJ¿ˆˇ¸Ó˘Ù¿ˆˇ¸Ó˘Ù¿
  3994. ˆˇ¸◊¿
  3995. ˆˇ¸◊¿
  3996. ˆˇ¸◊¿
  3997. ˆˇ¸◊¿ˆˇ¸Û˘Ç¸0`˙¿!ˆˇ¸Û˛@Ç˝0`Ä˙¿#ˆˇ¸Û„ûäúpÛÅ«ûpD‰T(ßYÁ`˚¿#ˆˇ¸Û    Hã"ÄD@(¢àEX(†°dà°ê˚¿#ˆˇ¸Û    Û»ä>¿DAË¢à)P%'°Dà±˚¿#ˆˇ¸Û    Hä 0DB(¢à)P%(°Dàç˚¿#ˆˇ¸Û    »ö DBi¶à–")°DàÖ˚¿#ˆˇ¸ÛÛFj‡3Ŷöp„P"&ùDg9˚¿ˆˇ¸Á Ú¿ˆˇ¸Á@Ú¿˝ˇ˚˚ˇ¸◊¿˝ˇ„˚ˇ¸◊¿¸ġÛ˚ˇ¸◊¿ˇ9πˇÛ˚ˇ¸◊¿ˇ9ªˇÛ˚ˇ¸◊¿ˇªˇÛ˚ˇ¸◊¿ ˇwÛ·˝ ?¸◊¿ ˇúwœsåŒ0√˜¸◊¿ ˇéwfl3ûœ9ÁùÛ¸◊¿ ˇŒoÄ3?üôÁò¸◊¿ ˇŒoüÛ?üôÁôˇ¸◊¿ ˇ≈/üÛ?üôÁôˇ¸◊¿ ˇÂüÛ?üôÁôˇ¸◊¿ ˇ„üÛ?üôÁôˇ¸◊¿ ˇÛüœ≥üœ9Áú˚¸◊¿ ˇÛø«sé«9Áúw¸◊¿# ˇ˜ø··√¸Ûı ¿¸¿'ˆˇ¸x˝ĸ˝@˙ Ä¸¿/ˆˇ    ¸¿ ¿¸XÂìé9ÛÇú≥â¿Á'ÁsΩ9N¿1ˆˇ+¸É3ºÛf œ6cÜdTPEDC"âä!®†à¢âë¿1ˆˇ+¸É6õª
  3998. ôª∂lŸÄDÙWÿ
  3999. EDB>à¢S·è؆è¢â™=¿1ˆˇ+¸É7õ3≥6füÄET
  4000. EDB à¢Rh( à"â™E¿1ˆˇ+¸É3ôõ3
  4001. ò36gòE4TE0DB à¢"(( à&âDM¿1ˆˇ+¸√qôõ3 ÿ36cD◊ì‹8–3Çàú!·«ßúgöq D5¿˘ˇ˜ˇˇ¸y∑ Û3 œ≥3√ĸο˘ˇ«ˇˇ¸Óο
  4002. ˘ˇÁˇˇ¸◊¿
  4003. ˘ˇÁˇˇ¸◊¿˝ˇ˛ˇˇ˝Áˇˇ¸◊¿˝ˇ¸ˇˇ˘Áˇˇ¸◊¿#˝ˇ¯<?d?¸Û¸0¸ @@¯¿%˝ˇ¸Ûè˘„˜¸Û˛@¸  @¯¿'˝ˇ¸Ûœ˘ÁùÛ¸Û„ûäúpÍrÃ9
  4004. )«Vy«X¯¿'˝ˇ¸ÁÁ˘Áò¸Û    Hã"ÄLã2E
  4005. ((Y"(d¯¿'˝ˇ¸ÁÁ˘Áôˇ¸Û    Û»ä>¿Hä"
  4006. E    IËQ",D¯¿'˝ˇ¸ÁÁ˘Áôˇ¸Û    Hä 0Hä"
  4007. E    J(Q"#D¯¿(˝ˇ¸ÁÁ˘Áôˇ¸Û    »ö Hä"E4ähQ"!DĢ¿(˝ˇ¸ÁÁ˘Áôˇ¸ÛÛFj‡Hr"8‘âßQŒDĢ¿˝ˇ¸Ûœ˘Áú˚¸ÍÔ¿˝ˇ¸±œ˘gúw¸ÍÔ¿˝ˇ˛|?¸√¸◊¿
  4008. ˆˇ¸◊¿
  4009. ˆˇ¸◊¿
  4010. ˆˇ¸◊¿
  4011. ˆˇ¸◊¿
  4012. ˆˇ¸◊¿
  4013. ˆˇ¸◊¿
  4014. ˆˇ¸◊¿ ¯ˇøˇ¸◊¿
  4015. ˘ˇ˛?ˇ¸◊¿¸ˇø˛ˇ?ˇ¸◊¿¸ˇø˛ˇ?ˇ¸◊¿¸ˇ˛ˇ?ˇ¸◊¿¸ˇ˛ˇ?ˇ¸◊¿˝ˇ˛ü–˙>¸◊¿˝ˇ˛œ aè9Ô¸◊¿˝ˇ˛œûsœ;Á¸◊¿˝ˇ˛œü3Á0¸◊¿˝ˇ¸ü3Á3ˇ¸◊¿,˝ˇ ˝Áü3Á3ˇ¸B¯˝@¸Ä@@P˚¿+˝ˇ ˝Áü3Á3ˇ¸Bˆ"@"¸@@P˚¿6˝ˇ,˚„ü3Á3ˇ¸BsÉ÷8,r¿ä¡f9dB∞z«ú∞NwÉú´†ÁX‡V;ŒS6˝ˇ,˚Ûûsœ9˜¸BÑAD2ã ã!ôEîB»#(Ç"»Q""â¡eYATX¸¿6˝ˇ,˚Òåqè8Ô¸B«¡|"ä.ä!}Bà"/Ç"à_""àæÅEQaW–¸¿6˝ˇ,‡¿Å>¸B4@"ä ä!ABà"("àP""à†ÅEQT¸¿4˚ˇüÛ˛ˇ%¸B@"ä ö!A¬à"("àP""à†ÅEQ    T¸¿4˚ˇüÛ˛ˇ%¸<„¿—<<s¿k¡=Bà'ÅúO!ÉúàûÄ‚DQpÕS–¸¿˚ˇüÛ˛ˇ¸˚ ˜ÄÏ¿˚ˇüÛ˛ˇ¸˚ ˜ÄÏ¿˚ˇ·˛ˇ¸◊¿
  4016. ˆˇ¸◊¿
  4017. ˆˇ¸◊¿˙ˇ˜flˇˇ¸◊¿ ˙ˇ«ˇˇ¸˚@˚˝¿)ˇˇ˝ˇÁüˇˇ¸˛˛˛˝ ¿,ˇˇœ˝ˇÁüˇˇ¸DUè98^uÇ«=8ÂÉ÷8Áñzr«Ú¿-'ˇˇœˇˇ˚ˇÁüˇˇ¸DVQED!HÜC(ëEAEÑY"ã(Ú¿-'ˇˇœˇˇÛˇÁüˇˇ¸*îQD™D0™HÑB/ê™}ÙA}èÑQ"ä,Ú¿-'ˇˇœ–‡·Áü£¸*îQD™D ™HÑB(™AA@hQ"ä#Ú¿.(ˇˇœ fÛÃÁúˆ¸SDDDDHÑB(DAA@(Q"ä! Û¿.(ˇˇœûfÛúÁùÛ7¸M8D88DFtC«åD<Ù@—=«Éûr. Û¿ ˇˇœûcÛºÁò?¸ÍÔ¿ ˇˇœûaÛ¸Áôˇ?¸ÍÔ¿ ˇˇœûxÛ¯Áôˇ?¸◊¿ ˇˇœû|s‰Áôˇ?¸◊¿ ˇˇœûns‹Áôˇ?¸◊¿ ˇˇœûnsúÁú˚?¸◊¿ ˇˇœûfÚòßúw?¸◊¿ ˇˇ !˘ÜC¸◊¿
  4018. ˆˇ¸◊¿
  4019. ˆˇ¸◊¿
  4020. ˆˇ¸◊¿+ˆˇ¸>˝<IJÄ0˛ ˛@Ģ¿)ˆˇ¸˝"Äĸ@˛ @˘¿1ˆˇ'¸ä¨X"rúr¡     ¡ÁSë¨Á*Ãs”ñ,r/X‡ºÂò·ë˛¿1ˆˇ'¸ã2d<
  4021. ¢ã!˙+ àÑTQ≤H≥2    Y≤ä$eëeQ˛¿1ˆˇ'¸ä"D"z¢ä! Í àÇ󠆢H¢"yQ¢ä$EëÙEħQ˛¿1ˆˇ'¸ä"D"ä¢ä!
  4022.  
  4023.  àÇî
  4024. †¢H¢"âQ¢ä$EëD`§Q˛¿1ˆˇ'¸ö"D"ö¢ä!
  4025.  
  4026.  àÅ@¢H¢"ôQ    ¢ädEëD DS˛¿1ˆˇ'¸j"D<júr!    Î¿gƒ@¢G""h”ëºq£DåÙE¿Cç˛¿ˆˇ¸ıÈÄ˝¿ˆˇ¸ı͸¿
  4027. ˆˇ¸◊¿
  4028. ˆˇ¸◊¿
  4029. ˆˇ¸◊¿
  4030. ˆˇ¸◊¿ˆˇ¸˚ fi¿ˆˇ¸¸ fi¿ˆˇ ¸„ÅÀ¨p9‘„ñ„¿ˆˇ ¸!B,Ç2àBY„¿ˆˇ ¸1˜¬(Ç"¯b˜—„¿ˆˇ ¸
  4031. (Ç"Ä„¿ˆˇ
  4032. ¸(Ç"Ä
  4033.  ‰¿ˆˇ
  4034. ¸8Û¡»Å¢xq–Û— ‰¿
  4035. ˆˇ¸◊¿
  4036. ˆˇ¸◊¿
  4037. ˆˇ¸◊¿
  4038. ˆˇ¸◊¿
  4039. ˆˇ¸◊¿
  4040. ˆˇ¸◊¿
  4041. ˆˇ¸◊¿
  4042. ˆˇ¸◊¿
  4043. ˆˇ¸◊¿
  4044. ˆˇ¸◊¿
  4045. ˆˇ¸◊¿
  4046. ˆˇ¸◊¿
  4047. ˆˇ¸◊¿
  4048. ˆˇ¸◊¿
  4049. ˆˇ¸◊¿
  4050. ˆˇ¸◊¿ˆˇ¸·˙ˇ¿ˆˇ¸‚Ä˙ ¿ˆˇ¸‚˘¿ˆˇ¸‚˘¿ˆˇ¸‚˘¿ˆˇ¸‚  ¿ˆˇ¸‚   ¿ˆˇ¸‚ #ΔgÄ¿ˆˇ¸˘Ó &fc¿ˆˇ¸˘Ó  ¶fc¿ˆˇ¸˘úÓ     Á„√¿ˆˇ¸˘HÓ Êc¿ˆˇ¸˘HÓ f&c¿ˆˇ¸˘HÓ #ΔaÄ¿ˆˇ¸˘HÓ˘¿ˆˇ¸˘àÓ˘¿ˆˇ¸‚˘¿ˆˇ¸‚˘¿ˆˇ¸‚Ä˙ ¿ˆˇ¸·˙ˇ¿
  4051. ˆˇ¸◊¿
  4052. ˆˇ¸◊¿
  4053. ˆˇ¸◊¿
  4054. ˆˇ¸◊¿
  4055. ˆˇ¸◊¿
  4056. ˆˇ¸◊¿
  4057. ˆˇ¸◊¿
  4058. ˆˇ¸◊¿
  4059. ˆˇ¸◊¿Àˇ¿Àˇ¿†É
  4060. d
  4061. °dONLNd˙…~’(“~[The Installer ships with several simple help screens, but you can override specific default°dONLNdV’~·"* _screens and add to the default help pages.  The Preference Resource contains a list of the help°dONLNd∂·~Ìfi* Ppages and is discussed in the section “Using the Installer Preference Resource”.
  4062.     °dONLNd˜~ö*NOTE
  4063. °dONLNd ~*_Easy-to-read screen fonts, as seen in Figure 2-8, are included in the SDK for your convenience.°dONLNdm~Î* RWe suggest that you use these fonts for your help window and splash screen text.  ,
  4064.  
  4065. Zapf Dingbats
  4066.     °dONLNdøÎÚ(Îu
  4067. °dONLNd¡56IB(D6Selecting an Installer Document"°∂ I4I0°∂°∂
  4068. °dONLNd·N~Z +HXWhen the user opens the Installer application directly the Installer searches the folder°dONLNd:Z~f * ]containing the application for one valid document.  If no documents or multiple documents are°dONLNdòf~rã* <found the Installer displays the dialog shown in Figure 2-9.ˇ∂dˇ ˇˇˇˇd
  4069. d, Palatino
  4070. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4071.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú21°dONLNdQ~\∞(Y~
  4072. Figure 2-9°dONLNd QΩ\=)?The Document Not Found Dialog°d WORD©Å
  4073. _~ˇò0`º‡`º‡_~˛—ˇÄ”Ä”ü”ˇ˘ü”ˇ˘ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”
  4074. ò˝ÿ
  4075. ò˝ÿ
  4076. ò˝ÿ-ò˝IJÏ`Ä¿ů `0 ˚ ˛-ò˝IJ å`IJ Ä0 `0 ˚ ˛0ò˝0¿˛%èáÄc·«èèèüÄ` |8Ò„1„`|xqôˇ8/ò˝0¿˛ åÿc3#ôôú˛ôÄ fdb˛3ÄÃÃ…˝ôåd/ò˝``˛ åÿc3Éôôò˛ô Ä fpaÛ33Ãá˝ôåp0ò˝f`˛ 圿c1√ôüò˛ôÄ f8c33ÛÃáôôüôå80ò˝œ0˛ åÃc0„ôò˛ôÄ fc33Ãáôôòå0ò˝œ0˛ åÃ@c2côòò˛ôÅ fLc33ÃÃ…ôôòôåL1ò˛è˛%å«Äc1¡èôèôèÄ f81Û1„|xp˘ôèÜ8 ò˛èŸ ò˛ Ÿ ò˛ Ÿ ò˛Ÿ ò˛Ÿ ò˛ Ÿ ò˛ Ÿ$ò˛ĸ¿ÃÄ    lå¯Δ˘$ò˛ĸ¿¿Äl Ã¯Δ˘.ò˛$0¿„‡<¯xÃqòf>f$ ÃxxpÁ√¿˚.ò˛0¿30Ãà Å∞˛fH ÃÃå…ò˛ôÄΔf`˚.ò˛``30Ãà ÷‡˛fåÃ|·ò˛ôÄΔf`˚-ò˛``30ø Ãq¿˝f ¸Ãq¯ôüôÄΔg‡˚,ò˛¿030ÿ Ã9‡˝f ¿Ã9ÄôòÄΔf˙-ò˛¿030à Ãô∞˝f¿ ƒÃôàôòôÄΔf ˚.òÄ„0 ÃxÃqò<˛>¿ x|pÄfc¿˚òÄÒ¯ıò˛ ÒF¯ıò˛ˇ¸Ò<Î
  4077. ò˛ˇ¯⁄ò”ò”ò”òÙ ;`˚`¸00ıòÛ``˚`˚0ı&ò¯«√√åÛ„√圯x¯3331«¿xé˘%ò¯
  4078. &ffLc2ffL˝Ã`˛3    33&`1òô3˘%ò¯
  4079. Üff c0ff ˝Ã`˛3    33Ü`1òú3˘&ò¯ΔgÊ c0ff ÃøÃ`˛3    31Δ`1òé?˘%ò˜Êf c0ff ÃÿÃ`˛3    30Ê`1òá0˘'ò¯ff&Lc2ffLÃÃÃ`˛3
  4080. 22f`1òì10˙'ò¯«√√åc„√áÃÃxÃ0¸1Δ`é0˙ò˜ÛÌò˜Û#Ì
  4081. òËÌò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò” òfl¯ˇ‡ òfl¯ˇ¯ òfl?¯ˇ¸ òfl|¯>ò͢ˇ¯q¯ˇéòÍ`˘ˆ¯oòÍ@˘‰¯'òÍĢ˯òÍĢ˯òÍ
  4082. ÄÄ `Ë„˙òÍ
  4083. Ä ¿`Ë˙òÍ
  4084. Ä ÃÃ˲·√¿òÍ
  4085. Ä ÃÃ`˲3&`òÍ
  4086. Ä ÃÃ`˲3Ü`òÍÄ ÃÃ`Ë331«‡òÍÄ ÃÃ`Ë330Ê˛òÍÄ ÃÃ`Ë332f#3òÍÄáÃ0Ë„1··√√3òÍIJ¿˝˯òÍĢ˯òÍĢ˯òÍ@˘‰¯'òÍ`˘ˆ¯oò͢ˇ¯q¯ˇé òfl|¯> òfl?¯ˇ¸ òfl¯ˇ¯ òfl¯ˇ‡ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ü”ˇ˘ü”ˇ˘Ä”Ä”—ˇ
  4087. d
  4088. °dONLNd)~(~VClicking Choose displays the standard Open Dialog so the user can choose one Installer°dONLNdÄ~(…* Jdocument to open.  Clicking Cancel in the Open Dialog quits the Installer.°dONLNdÀ0~<.*dAfter opening the Installer document the Installer looks for the script version resource (‘invs’) to°dONLNd0<~H%* _determine if the version of the Installer application is properly matched to the version of the°dONLNdêH~T* ]script.   With Installer version 4.0.3 and newer, the Installer will allow the user to open a°dONLNdÓT~`)* adocument with a smaller version than the Installer.  If this is the case, the Installer shows the°dONLNdP`~lfi* dialog in Figure 2-10.
  4089.     °dONLNdgt~∞*
  4090. Figure 2-9°dONLNdrtΩJ)?!The Early Version Document Dialog
  4091. Ç~J˛òÄ0Y!ÄHH∞ÑġˇˇˇˇˇY!ÄÇ~J˛—ˇÄ”Ä”ü”ˇ˘ü”ˇ˘ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”
  4092. ò˝ÿ
  4093. ò˝ÿ
  4094. ò˝ÿ+ò˝IJ Ï`Ä`˚ `0Ä ¿˘ÒôÒ∞¸+ò˝IJ å`Ä`˚`$0Ä ¿¡˛ô∞¸0ò˝0¿˛%èáÄc·«èè„√圯x¯61„«å¿¡ôôòê31·¿/ò˝0¿˛åÿc3#ôôúffL˝Ã`61ôëàÿ¡˛ô 323 /ò˝``˛åÿc3Éôôòff ˝Ã`1ô¡áÿÒô˘ò31ÛÄ0ò˝f`˛%圿c1√ôüòff ÃøÃ`1ò·åÿ¡ôôò331¿0ò˝œ0˛%åÃc0„ôòff ÃÿÃ`1òqåÿ¡ôôò330‡0ò˝œ0˛%åÃ@c2côòòffLÃÃÃ`1ô1åÿ¡ôôò3#2`1ò˛è˛%å«Äc1¡èôè„√áÃÃxÃ01ò‡«Ã¿¡Òô?¡Ò¿ ò˛èŸ ò˛ Ÿ ò˛ Ÿ ò˛Ÿ ò˛Ÿ ò˛ Ÿ ò˛ Ÿ,ò˛Ä˝ ¿ ¿˛1ܲ‡¸    Ä¸%ò˛Ģ ¿˛ÜĢÅò ¸0ò˛&0¿„l|œáåÿÃÕ≥œ>«çÉ1„gÒÅòü˝1ò˛'0¿3åÃûÃÿÌ1Ü33åŒ33åôôò    ÅòåôIJ1ò˛'``3 ÃëÃÿÃÃ1Ü33åÃ33ôòÅòåôIJ/ò˛``3 ¸Ã¿ÃÃ1Ü?3åÃ3Ûôò¡òåüIJ.ò˛¿03 ¸Ã¿ÃÃ1Ü03åÃ3ôôòÅòåò˝/ò˛¿03 ¸Ã¿Ãå1Ü13åÃ#    ôôòôòåòIJ0*òÄ„ |ëë¿ˇ 0√3áå¡„Òòò ôè˝òĸ ˝¿Âò˛ ¸å˛¿Âò˛ˇ¸¸x˛ÄÂ
  4095. ò˛ˇ¯⁄ò”ò”ò”ò¯Ä f‚ò¯Ä f‚ò¯èá<f<l‰ò¯åÃåFffp‰ò¯åŒ >ff`‰ò¯å« ff~`‰ò¯å√åff``‰ò¯å…åffbaÄÂò¯å«>f<aÄÂò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”$ò¯    „0<1IJ¿˝    000Ä ¿¯#ò¯b0˝¿˝    00Ä ¿¯'ò¯1Δ``<|yüè„¿f8x>1¿1„«å«çÄ˙&ò¯3&¿`ff1˛ôÄΔ`fdÃ33 1ôëàÃÃŒ˘%ò¯3Ä`ff1˛ô
  4096. ÄΔ`fpÃ33Ä1ô¡á˛Ã˘&ò¯3`ff1ôôüÄΔ`f8¸31¿1ò·åÃœÃ˘&ò¯3Ä`ff1ôôòΔ`f¿30‡1òqåÃà ˘&ò¯3&¿bff1ôôòÄΔ`fLƒ32`1ô1åÃÃL˘&ò¯„1Δ`<<fôèèc¿>8x31¿1ò‡«Ã«å˘ò”ò”ò”ò”ò”ò”ò˜Ä˜ÄÈ(ò¯˝¿ ĸ@˛
  4097. 0<c¿`˝1Ä˝%ò¯˙ ¿`˛
  4098. f¿`˝1Ä˝+ò¯!è«èÄ, ¿0`Δ¿„1Δ`ffgÅ„¿c√Δc¿y˛+ò¯!ôúdÃÿL ¿x`gì3&¿ffcΔ`fdff`1ôò˛+ò¯!ôòpÃÃ¿å ¿ `fÉ3ÄffcΔ`fcÊf`1ôò˛+ò¯!üò8Ãÿ˛ ¿ `fÉ3ffcΔ`gÊfg‡1ô¯˛+ò¯!òÃÿ ¿ `fÉ3ÄffcΔ`fff1ôIJ+ò¯!òLÃÿ ÃÃåffì3&¿ffcΔ`f&fF 1ôà˛+ò¯!8«å¿ «åxFΔ„1Δ`<>aÄc¿c√ÁÉ¿ò˛ò˜Ä˜Ç˙Ò
  4099. òÏÈò”ò”ò”ò”ò”ò¯Ä f‚ò¯Ä f‚ò¯èá<f<l‰ò¯åÃåFffp‰ò¯åŒ >ff`‰ò¯å« ff~`‰ò¯å√åff``‰ò¯å…åffbaÄÂò¯å«>f<aÄÂò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò” òfl¯ˇ‡ òfl¯ˇ¯ òfl?¯ˇ¸ òfl|¯>ò͢ˇ¯q¯ˇéòÍ`˘ˆ¯oòÍ@˘‰¯'òÍĢ˯òÍĢ˯òÍÄÄ `Ëxc˝òÍÄ ¿`˃`˝òÍÄ ÃÃË¿x¯Û>3òÍÄ ÃÃ`Ë¿ÃÃc˛3òÍÄ ÃÃ`Ë¿ÃÃc˛3òÍÄ ÃÃ`Ë¿ÃÃc33?òÍÄ ÃÃ`Ë¿ÃÃc330òÍÄ ÃÃ`˃ÃÃc331òÍÄáÃ0ËxxÃ33òÍIJ¿˝˯òÍĢ˯òÍĢ˯òÍ@˘‰¯'òÍ`˘ˆ¯oò͢ˇ¯q¯ˇé òfl|¯> òfl?¯ˇ¸ òfl¯ˇ¯ òfl¯ˇ‡ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ò”ü”ˇ˘ü”ˇ˘Ä”Ä”—ˇ
  4100. d
  4101. °dONLNdîb6vq(q6Menus"°∂ v4v0°∂°∂
  4102. °dONLNdö{~á#+H^To allow the user to easily switch processes and to turn balloon help on and off the Help menu°dONLNd˘á~ì* Yand Application menus will be shown under System 7.X.  An “About Installer…” item will be°dONLNdSì~üÛ* shown in the Apple menu.ˇÇdˇ ˇˇˇˇd
  4103. d, Palatino
  4104. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4105.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú22
  4106. °dONLNdQ~`…(\~
  4107. Apple Menu"°∂ _|_0°∂°∂
  4108. °dONLNd d~p(*]The Apple Menu will be shown in full when running under 7.X, but will only contain the “About°dONLNdjp~|* \Installer…” item when running on pre-7.0 systems.  Desk Accessories will not be shown in the°dONLNd«|~àÔ* Rmenu under pre-7.0 systems to restrict DAs from being opened within the Installer.
  4109.     °dONLNdê~õ∂* Figure 2-10°dONLNd&êΩõ)?The Apple Menu.†Ç
  4110. û~ƒòU∏{PUª{Pû~ƒ˛ˇÒ˛ˇÒˇœˇÒˇüˇÒˇøˇÒ¸GˇÒ¯ˇÒ¯ˇÒ¯ˇÒ¯ˇÒ¯ˇÒ¸ˇÒ˛OˇÒ˛ˇÒ˛ˇÒ˛ˇÒ˛ˇÒ˛ˇÒˇ˛  ø ò øüû<xÃxÿ˛˛ôåôåÃDz˛ôåú|Ãÿ˛˛ôåéÃø¿˛˛ôåáÃÿ¿˛˛ô
  4111. åìÃáôÄüÜé |Ãx¡ôÄÔˇÔˇ†É
  4112. d
  4113. °dONLNd6ÿ~Á¬(„~    Help Menu"°∂ Ê|Ê0°∂°∂
  4114. °dONLNdAÎ~˜*[The Help menu will be available to users when running under System 7.X.  In addition to the°dONLNdù˜~* Wstandard two menu items the Installer will add an “Installer Help…” item that opens the°dONLNdı~Ó* Installer’s help window.
  4115.     °dONLNd~"∂* Figure 2-11°dONLNdΩ"˚)?The Help Menu.†Ç
  4116. %~ä!ò∞P∞V˘%~ä!Ò˝ˇ    ÒˇÄˇ    Òˇ˚ˇ    Ò˛¯}ˇ    Ò˛Û=ˇ    Ò˛Û=ˇ    Ò˛˛}ˇ    Ò˛¸˝ˇ    Ò˛¸˝ˇ    Ò˛ˇ˝ˇ    Ò˛¸˝ˇ    Ò˛¸˝ˇ    Òˇ˚ˇ    Òˇ∞ˇ    ÒˇØˇˇ    Òˇüˇˇ    ÒˇøˇˇÒ˝ˇÌˇÓÓÓÄ
  4117. „Ä¯Ã˛ ¿ ˛Ä
  4118. 3ÄÃÃ˛ ¿ ˛Ä3·„3¿ÃxÃxx¯ «å¯Ä˛31ÄÃå˝Ã ˛ÃÄ    Û331į|˝Ã˛ÃIJ31Ä˚à œÃÃIJ31Ä˚à à ÃIJ31Ä˚à ÃLÃf`Ä3··¿¯|Ãxxà «å¯f`Ä
  4119. Ò¿Ä
  4120. Ò¿ÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÌUÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄΔ˛¿`¯Ä&˛``¯Ä√ΔfcΔc√«√ĸÄܲfd¸f@¸ÄΔ˛f√Ê˛fg˚ÄÊ˛f¸fcĸÄ˝f¸fa¿¸Ä˛fd¸fd¿¸ÄΔc«¯√Êc√ΔcĸÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÌUÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄÓÄ Ã30˙Ä Ã30˙Ä
  4121. <xÃxÿ33‡˚Ä    ôåÃDz30˚Ä
  4122. ú|Ãÿ?330˚Ä
  4123. éÃø¿3?30˚Ä
  4124. áÃÿ¿3030˚ÄìÃÿ3131ôÄ˝Äé |Ãx¿33·ôÄ˝Ä ˆ˙Ä ˆ˙ÄÓÄÓÄÌˇÄӡĆÉ
  4125. d
  4126. °dONLNd)í~û∞(õ~BThe Help menu is not available when running under pre-7.0 systems.
  4127. °dONLNdl≤~¡Í*"Application Menu"°∂ ¿|¿0°∂°∂
  4128. °dONLNd~≈~—**]The Application menu will be available to users when running under System 7.X.  Under pre-7.0°dONLNd‹—~›* Usystems using MultiFinder the user can switch between applications by clicking on the°dONLNd2›~ÈÕ* MultiFinder icon.
  4129.     °dONLNdDÒ~¸∂* Figure 2-12°dONLNdPÒΩ¸)?The Application Menu.†Ç
  4130. ˇ~xòX{‡^{‡ˇ~xÙˇˇ˛Ù‡˛Ùfl˚˛Ù– ˛Ù◊βÙ’k˛Ù◊βÙ’βÙ◊βÙ– ˛Ùfl˚˛Ùfl˚˛Ùfl ˛Ùfl˚˛Ù‡˛Ù‡˛Ùˇˇ˛Ùˇˇ˛Úˇ˛ÚÚÚ    3Ê˚    0˚ 3|><l˝˛3˛fp˝Û33Δ˛f`˝ 33?ff~`˝ 330ff``˝ 331ffb`˝ 3f><`˝ÚÚÚÚÚÚÚ3·å˙01å˙ 33œáçú˝˛31åÃŒ2˝ Û331åÃÃ8˝ 33?1åœÃ˝ 3301åà ˝ 3311åÃL&˝ 3‡Ã«å˝ÚÚÚÚÚÚÚD˛D@˚"˛" ˚    ADDD@˚Dz"" ˚˝DD@˚¢˛"" ˚˝DD@˚˛" " ˚    DAEPD@˚ÚÚÚÚÚÚÚÚÚÚÚÚÚUWÚÚÚÚÚÚÚÚ ˇ¿ˆ  ˆ †ˆ@†>``˙T†0`˙
  4131. @†0g√„Δ¿¸P†0˛fg˚@†<˝f˚    †0ffgÊ˚ 0˛f˚ 0˛f&˚    †0fc„Δ˚  ˆ ˇ¿ˆ ˇ¿ˆÚÚÚ
  4132.  ı
  4133. ı
  4134. !ı
  4135. LÄ¿`¸
  4136. å@¿`¸ !? ¯q„ΔcΔ¿˛ bûƒffg˝ ƒ Ç√Êff˝ ÑÃpΔfgÊ˝ #?Ã8Δff˝ 6! ÃòΔff&˝ ≠@ÃpcÊcΔ˝ iĈ
  4137. !ı
  4138. !ı
  4139. ıÚÒˇÚˇ†É
  4140. d
  4141. °dONLNdfê6§º(ü60Using the Installer Preference Resource (‘inpr’)"°∂ §4§0°∂°∂
  4142. °dONLNdó©~µ+H^The preference resource allows the scriptwriter to override certain default interface features°dONLNdˆµ~¡* aand actions of the Installer.  To utilize this control you must add a preference resource (‘inpr’°dONLNdX¡~Õ* aID=300) to the script file.  The Installer contains a default ‘inpr’ resource with the ID of 305.°dONLNdªÕ~Ÿ.* fThe Installer first looks for your ‘inpr’ with the ID 300, and if not found uses its default resource.ˇ“dˇ ˇˇˇˇd
  4143. d, Palatino
  4144. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4145.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú23
  4146. °dONLNdQ~](Z~\The fields and flags in the preference resource control two main areas of the Installer, the°dONLNd]]~iÓ* Precommended target disk/folder selection, and specific human interface elements.
  4147. °dONLNdÆ}~åß*",Controlling the Recommended Target Selection"°∂ ã|ã0°∂°∂
  4148. °dONLNd€ê~ú!*\The Installer automatically recommends the target disk, target folder and system disk if the°dONLNd8ú~® * ascriptwriter does not provide a preference resource in the script file.  If you wish to allow the°dONLNdö®~¥!* auser to select a target folder then it’s important to at least provide a suggested folder name in°dONLNd¸¥~¿(* _your preference resource.  To have more control over the recommended target disk, target folder°dONLNd\¿~Ã,* aand system disk you can supply a code resource to be called to determine these values.  This code°dONLNdæÃ~ÿ?* .resource is referred to as the setup function.°dONLNḋ~Ï*]The setup function can recommend the initial values for target disk, target folder and system°dONLNdKÏ~¯* _disk, but the Installer will consider these new values only as suggestions and will not use any°dONLNd´¯~* `value that would be unreasonable.  The setup function is called prior to rule execution, or if a°dONLNd ~≤* Fsplash screen is provided, after the user dismisses the splash screen.°dONLNdT~$*^If no setup function is supplied, or a value recommend by the setup function is not valid, the°dONLNd≥$~0ö* AInstaller selects the target values using the following strategy:,
  4149.  
  4150. Zapf Dingbats
  4151.     °dONLNdı:~CÖ*n
  4152. °dONLNd˜8êD!)ZTarget disk — The Installer first looks for the selected boot disk (value stored in PRAM),°dONLNdRDêP&* Zthen looks at the SCSI ID 0 hard disk, then at the other SCSI disks, then for an old HD 20°dONLNd≠Pê\
  4153. * Phard disk, then any mounted floppies, then the RAM disk, and finally any mounted°dONLNd˛\êh¥* volume.
  4154.     °dONLNdr~{Ö(y~n
  4155. °dONLNdpê|')[Target application folder — Selects the folder with the name specified in the script file’s°dONLNdd|êà(* _preference resource on the root level of the target disk.  If the scriptwriter does not provide°dONLNdƒàêî%* _a preference resource, the preference resource in the Installer file will be used.  The current°dONLNd$îê†?* &default folder name is “Applications”.
  4156.     °dONLNdK™~≥Ö(±~n
  4157. °dONLNdM®ê¥&)[System disk — Looks first at the boot disk and then the selected boot disk (value stored in°dONLNd©¥ê¿%* YPRAM), and if one contains a blessed System Folder and is a valid target volume and not a°dONLNd¿êÃˇ* Pfloppy disk selects that volume.  Otherwise, selects the recommended target disk°dONLNdTÃêÿÜ* 9regardless if it contains a blessed System Folder or not.
  4158. °dONLNdéÏ~˚
  4159. (˜~Specifying Help Pages"°∂ ˙|˙0°∂°∂
  4160. °dONLNd§ˇ~ -*aThe preference resource holds the list of ‘PICT’ resource IDs that specify the pages shown in the°dONLNd     ~Ω* help window.°dONLNd    ~+u*6The help window is divided into two vertical sections:
  4161.     °dONLNd    K5~>Ö*n
  4162. °dONLNd    M3ê?)WGraphic Section — This section begins at the left edge of the window and extends to the°dONLNd    •?êK* Yright edge of the window.  Most often you’ll use this section to display a 100 pixel wide°dONLNd    ˇKêW * Zcolor graphic that can be shared among several pages.  This strategy saves disk space.  If°dONLNd
  4163. ZWêc* Vyou have simple help pages that are all B/W, then use this section to display a ‘PICT’°dONLNd
  4164. ±cêo* Xresource that is the same width as the help window.  Enter zero for the ID to leave this°dONLNd
  4165. oê{Œ* section blank.
  4166.     °dONLNd Ö~éÖ(å~n
  4167. °dONLNd Éêè&)ZText Section — This section begins 100 pixels from the left edge of the window and extends°dONLNd vèêõ * \to the right edge of the window.  This section is used most often to hold text that does not°dONLNd ”õêß®* Bcontain color.  Enter zero for the ID to leave this section blank.°dONLNd Ø~ª!(∏~]Two ‘PICT’ resource IDs must be entered for each section, one for display on B/W monitors and°dONLNd tª~« * ]the other for monitors displaying 256 or more colors/grays.  You may use the same ID for both°dONLNd “«~”* ^color and B/W ‘PICT’ IDs.  Use the special ID of 0 (zero) to display white space in a section.ˇ0dˇ ˇˇˇˇd
  4168. d, Palatino
  4169. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4170.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú24
  4171. °dONLNdQ~]"(Z~\The Installer ships with several basic help pages, which you can add to or replace with your°dONLNd]]~iJ* 0own ‘PICT’ resources stored in your script file.
  4172. °dONLNdé}~åü*"-Allowing Installation onto AppleShare Volumes"°∂ ã|ã0°∂°∂
  4173. °dONLNdºê~ú¨*
  4174. Using the ,
  4175. Courier°dONLNdΔê¨ú).allowServerAsTarget°dONLNdŸêú%)r; flag allows the user to select and install onto AppleShare°dONLNdú~®.(•~bvolumes.  This flag is an unsupported and untested feature, and is available only as a courtesy to°dONLNdx®~¥.* `those developers that have hacked previous versions of the Installer to gain this functionality.,
  4176.  
  4177. Zapf Dingbats
  4178. °dONLNdŸæl»u(Δls
  4179.     °dONLNd€æ~…¡)
  4180. W A R N I N G
  4181. °dONLNdÈÃ~ÿ*\Only those scriptwriters that absolutely, positively, must allow their users to install onto°dONLNdFÿ~‰A* )AppleShare server volumes should use the °dONLNdoÿA‰≥)√allowServerAsTarget°dONLNdÇÿ≥‰-)r flag!  You should never try°dONLNdü‰~ç(Ì~=to install anything into the server volume’s System Folder!  
  4182.     °dONLNd‹ÊçÔï(Ìçs
  4183. °dONLNdfi6Ü(6'Installer Preference Resource Reference"°∂ 40°∂°∂
  4184. °dONLNd!~-≠+HGThis section describes the resource description of the ‘inpr’ resource.
  4185. °dONLNdNA6QΩ(M6Resource Description"°∂ Q4Q0°∂°∂
  4186. °dONLNdcV~b+H$Format 0 of the new ‘inpr’ resource:°dONLNdàf~r®*#define°dONLNdêf¥r)6preferenceFlags°dONLNd≠f
  4187. r(o
  4188. \°dONLNd∞qê}∫(zêboolean°dONLNd∏qΔ}∞)6'useDiskTargetMode, useFolderTargetMode;°dONLNd‰q
  4189. }(z
  4190. \°dONLNdÁ|êà∫(Öêboolean°dONLNdÔ|Δà)68dontAllowUserToSetSystemDisk, allowUserToSetSystemDisk;\°dONLNd)áêì∫(êêboolean°dONLNd1áΔì)68dontShowSelectedSizeInCustom, showSelectedSizeInCustom;\°dONLNdkíêû∫(õêboolean°dONLNdsíΔû‡)6/noSetupFunctionSupplied, setupFunctionSupplied;°dONLNd•í
  4191. û(õ
  4192. \°dONLNd®ùê©∫(¶êboolean°dONLNd∞ùΔ©º)6)dontAllowCleanInstall, allowCleanInstall;°dONLNdfiù
  4193. ©(¶
  4194. \°dONLNd·®ê¥∫(±êboolean°dONLNdÈ®Δ¥‘)6-dontAllowServerAsTarget, allowServerAsTarget;°dONLNd®
  4195. ¥(±
  4196. \°dONLNd≥êøfi(ºê
  4197. fill bit[10];°dONLNd*…~’Ã(“~
  4198. type 'inpr' {°dONLNd:‘¢‡“+$ switch {°dONLNdFfl¥Î+
  4199. case format0:°dONLNdXÍΔˆ&+ key integer = 0;°dONLNdjÍDˆ‘)~/* Preference version */°dONLNdáıΔ&(˛ΔpreferenceFlags;°dONLNdôıD»)~/* Preference Flags */°dONLNd¥Δ &(    Δliteral longint;°dONLNdΔD ⁄)~/* Setup Function Type */°dONLNd‰ Δˆ(Δinteger;°dONLNd 2¯)l!/* Setup Function Code Rsrc Id */°dONLNdΔ"»(Δ+unsigned integer = $$CountOf(helpPagelist);°dONLNdG!Δ-\* wide array helpPagelist {°dONLNdf,ÿ82+ /* Help Page */°dONLNd{7ÿC* integer;°dONLNdá7DC)l#/* B/W Graphic Section ‘PICT’ ID */°dONLNd∞BÿN(Kÿinteger;°dONLNdºBDN)l /* B/W Text Section ‘PICT’ ID */°dONLNd‚MÿY(Vÿinteger;°dONLNdÓMDY")l%/* 8-Bit Graphic Section ‘PICT’ ID */°dONLNdXÿd(aÿinteger;°dONLNd%XDd)l"/* 8-Bit Text Section ‘PICT’ ID */°dONLNdLcΔo“(lΔ};°dONLNdSnΔz>* pstring; align word;°dONLNdhnDz⁄)~/* Default Folder name */°dONLNdÖy¢ÖÆ(Ç¢};°dONLNdàÑ~êä(ç~};
  4200.     °dONLNdãï~†‘*Flag descriptions
  4201. °dONLNdù£~Ø\*%useDiskTargetMode/useFolderTargetMode°dONLNdƒÆ∫+ê <Specifies whether the user can choose a target folder, or is°dONLNd∫Δƒ* +limited to choosing a target disk.  If the °dONLNd,∫ƒΔ*)∂useDiskTargetMode°dONLNd>Δ“ (œ>flag is specified, “Switch Disk ” and “Eject Disk” buttons are°dONLNd}“fi)* Bshown to the user.  This is very similar to the old Installer 3.X.ˇËdˇ ˇˇˇˇd
  4202. d, Palatino
  4203. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4204.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú25
  4205. °dONLNdQ]-(ZIf the ‘,
  4206. Courier°dONLNdQ-]•)useFolderTargetMode’°dONLNdQ•])x flag is specified, the°dONLNd4]i (f<interface appears with a “Select Folder…” button, instead of°dONLNdqiu÷* ,the “Switch Disk ” and “Eject Disk” buttons.°dONLNdû}~âº(Ü~5dontAllowUserToSetSystemDisk/allowUserToSetSystemDisk°dONLNd’àî +ê 5Specifies whether the user can change the recommended°dONLNd î†h* System disk.  If the °dONLNd îh†¯)ZallowUserToSetSystemDisk°dONLNd8)ê flag is°dONLNdA†¨(©:specified, the “Select Folder…”  button changes to “System°dONLNd|¨∏* 6Disk…” when the Option Key is depressed.  Clicking the°dONLNd≥∏ƒ,* =“System Disk…” button displays a dialog  with a pop-up of the°dONLNdÒƒ–h* valid System disks.°dONLNdÿ‰"*The °dONLNd
  4207. ÿ"‰≤)allowUserToSetSystemDisk°dONLNd"ÿ≤‰&)ê  flag is ignored unless the°dONLNd?‰(Ì;useFolderTargetMode flag is set (see section above). If the°dONLNd{¸* 9useDiskTargetMode flag is used, there is no change to the°dONLNdµ¸* 4“SwitchDisk”  button when the Option Key is pressed.°dONLNdÍ~º(~5dontShowSelectedSizeInCustom/showSelectedSizeInCustom°dONLNd '*+ê =Specifies whether the Installer should calculate and show the°dONLNd^'3#* ?total size of the currently selected custom items in the Custom°dONLNdû3?,* Aand Remove Install interfaces.  Since the Installer does not look°dONLNd‡?K#* >at the target disk when calculating this value, it will almost°dONLNdKW)* ;always be overestimated.  Common packages are only included°dONLNd[Wc* >once in the calculation, but for some scripts this may confuse°dONLNdöco™* #more than help the user, so use the°dONLNdæo{∂* dontShowSelectedSizeInCustom°dONLNd⁄o∂{)® flag to hide the field.°dONLNdÙ{á¬(Ñ(Showing the field is the default action.°dONLNdè~õå(ò~-noSetupFunctionSupplied/setupFunctionSupplied°dONLNdKö¶(+ê ?Specifies whether the Installer should call the setup function.°dONLNdå¶≤* ;The type and ID of the setup function code resource must be°dONLNd»≤æ◊* -entered in the setup function fields when the°dONLNdˆæ å* setupFunctionSupplied°dONLNd æå ⁄)~ flag is specified.°dONLNd“~fiò(€~/dontAllowServerAsTarget/dontAllowServerAsTarget°dONLNdO›È.+ê @Specifies whether the Installer should allow the user to install°dONLNdêÈıä* onto AppleShare volumes.  °dONLNd™Èäı¡)|WARNING°dONLNd±È¡ı    )7:  This flag is an°dONLNdƒı(˛<unsupported and untested feature, and is available only as a°dONLNd
  4208.  * 6courtesy to those developers that have hacked previous°dONLNd8
  4209. '* Aversions of the Installer to gain this functionality.  Only those°dONLNdz%* ;scriptwriters that absolutely, positively, must allow their°dONLNd∂%1(* >users to install onto AppleShare server volumes should use the°dONLNdı1=Ä* allowServerAsTarget°dONLNd1Ä=$)r& flag!  You should never, ever install°dONLNd/=Iœ(F)anything into the volume’s System Folder!
  4210.     °dONLNdZS~^◊([~Field descriptions
  4211. °dONLNdma~mD*!Setup Function Code Resource Type°dONLNdèlx++ê BThe resource type of the setup function code resource.  This field°dONLNd“xÑk* is ignored unless the °dONLNdËxkÑÈ)]setupFunctionSupplied°dONLNd˝xÈÑ)~ flag is°dONLNd    Ñê‡(ç2specified.  The type is usually ‘infn’.  (4-bytes)°dONLNd    :ò~§8(°~Setup Function Code Resource ID°dONLNd    [£Ø,+ê CThe resource ID of the setup function code resource.  This field is°dONLNd    üتa* ignored unless the °dONLNd    ≤Øaªfl)SsetupFunctionSupplied°dONLNd    «Øflª-)~ flag is specified.°dONLNd    ‹ª«7(ƒ    (2-bytes)ˇdˇ ˇˇˇˇd
  4212. d, Palatino
  4213. .+~*C  H  A  P  T  E  R      2,     Helvetica
  4214.     *Installer Human Interface(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú26
  4215. °dONLNdQ~]Æ(Z~    Help Page°dONLNd
  4216. Q])ê;Four resource IDs of ‘PICT’ resources that make up one help°dONLNdF]iä* page.  ( Four 2-byte values ),
  4217. Courier°dONLNddq~}2(z~Recommended Target Folder Name°dONLNdÉ|à&+ê =The recommended target folder name.  This can be specified at°dONLNd¡àî'* ?run-time by the scriptwriter in the setup function. As with any°dONLNdî† * 9file name, the length should be limited to 31 characters,°dONLNd;†¨* <although the Installer will truncate the string if too long.°dONLNdy¨∏é* (even-padded Pascal string)
  4218. °dONLNdïÃ6‹ú(ÿ6Data Structures"°∂ ‹4‹0°∂°∂
  4219. °dONLNd•·~Ì++HcThe setup function is a code resource specified in the preference resource that is passed a pointer°dONLNd    Ì~˘* \to a parameter block with information about the Installer’s environment.  The entry point of°dONLNdf˘~>* +this code resource must have the interface:°dONLNdí    ~ú*OSErr°dONLNdò    ¢Œ)$2EnvironmentSetupFunction( EnvironmentSetupPBPtr );°dONLNdÀ#~/(,~^Return the result code noErr to have the Installer continue as normal.  Return the result code°dONLNd*/~;‰* kQuitInstallerNow°dONLNd;/‰;)fG to force the Installer to quit immediately.  Returning any other value°dONLNdÉ;~Gƒ(D~Mwill cause an error alert to be display before forcing the Installer to quit.°dONLNd—O~[*[The parameter block contains the Installer’s suggested target application folder and system°dONLNd-[~g * Ydisk.  The fields in the parameter block can be changed to override the suggested values.°dONLNdák~w‰*typedef  struct {°dONLNdôv~Çê*  —>°dONLNdùv¢ÇÃ)$ProcPtr°dONLNdßv¸Çb)ZfCallBackProcPtr;°dONLNdπÅ~çê(ä~<—>°dONLNdΩÅ¢çΔ)$FSSpec°dONLNdΔŸçP)ZfTargetFSSpec;°dONLNd’å~òê(ï~<—>°dONLNdŸå¢ò¿)$short°dONLNd‚å¸òV)ZfSystemVRefNum;°dONLNdÚó~£å(†~-} EnvironmentSetupPB, *EnvironmentSetupPBPtr;
  4220.     °dONLNd ≥~æ◊*Field descriptions
  4221. °dONLNd3¡~Õfi*fCallBackProcPtr°dONLNdD¡Õ)ê>A pointer to the Installer’s dispatch routine.  You’ll need to°dONLNdÉÕŸ* 9pass this field as a parameter to Installer function glue°dONLNdΩŸÂ5*     routines.°dONLNd«Ì~˘Ã(ˆ~
  4222. fTargetFSSpec°dONLNd’Ì˘)ê=Contains the Installer’s suggested target folder information.°dONLNd˘* =You can choose to override this suggestion by changing any of°dONLNdRZ* the fields in the °dONLNddZ~)LFSSPec°dONLNdj~»)$ structure.  If the°dONLNd~t(useDiskTargetMode°dONLNdèt
  4223. )f$ flag is specified in the preference°dONLNd¥)_(&resource, only the °dONLNd«_)â)QvRefNum°dONLNdŒâ)Ø)*
  4224.  field of °dONLNdÿØ)˝)&
  4225. fTargetFSSpec°dONLNd½)*)N  is used by°dONLNdÒ)5K(2the Installer.°dONLNd=~I“(F~fSystemVRefNum°dONLNd=I")êThe °dONLNd="Iv)fSystemVRefNum°dONLNd!=vI˘)T field contains the Installer’s°dONLNdAIU.(R=recommended System Folder volume.  You can choose to override°dONLNdUa* <this suggestion by changing the value passed.  This field is°dONLNdºamx* ignored when using the °dONLNd”axmfi)juseDiskTargetMode°dONLNd‰afim))f flag because the°dONLNdˆmy
  4226. (v7system disk must always be the same as the target disk.ˇ dˇ ˇˇˇˇd
  4227. d, Palatino
  4228. .+~-C  H  A  P  T  E  R      3,     Helvetica
  4229.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú27
  4230. $°dONLNdQ~y (o~Packages and Atoms"°∂ 40°∂°∂
  4231. °dONLNd~*t*∏5This chapter describes how to use packages and atoms.
  4232. °dONLNdIB6V˙(Q6About Packages (‘inpk’)"°∂ V4V0°∂°∂
  4233. °dONLNda[~gÅ+H:The package is added to the Custom Install list using the ,
  4234. Courier°dONLNdõ[Ågœ(dÅ
  4235. AddCustomItem°dONLNd®[œg!)N rule clause, and if°dONLNdΩg~s(p~]selected when clicking the Install or Remove button, will be added to the list of packages to°dONLNds~í* @install/remove.  For an Easy Install, the Installer rule clause °dONLNd[sí‘(|í AddPackages°dONLNdfs‘&)B is used to build up°dONLNd{~ã(à~Ythe list of packages that the Installer will use to perform the bulk of the installation.
  4236. °dONLNd’£6∑π(≤6Using Packages"°∂ ∑4∑0°∂°∂
  4237. °dONLNd‰º~»+HZPackages group atoms to make scripting easier, and to provide the hierarchical list in the°dONLNd?»~‘* ZCustom Install dialog.  The package contains a list of those atoms and other packages that°dONLNdö‘~‡Î* Oshould be installed or removed when the parent package is installed or removed.
  4238. °dONLNdÏÙ~I*" Using Packages with Easy Install"°∂ |0°∂°∂
  4239. °dONLNd
  4240. ~+*aOne of the goals of the Easy Install rules is to specify the packages that will be installed when°dONLNdo~˜* Wthe user clicks the Install button.  Your Easy Install rules should eventually call the°dONLNd«~+* [AddPackages rule clause to specify the packages, and ultimately the atoms, to be installed.°dONLNd$+~7#* `During an easy installation, the Installer is only concerned with the parts list and the restart°dONLNdÖ7~C* [flag.  The other fields are currently used only in the Custom Install and Remove interface.
  4241. °dONLNd‚W~fÆ*"-Using Packages with Custom Install and Remove"°∂ e|e0°∂°∂
  4242. °dONLNdj~v*[Packages are the foundation for the selectable items the user can choose from in the Custom°dONLNdlv~Ç!* ^Install list.  Packages are included at the top-level of the list by calling the AddCustomItem°dONLNdÀÇ~é+* `rule clause from the Custom Install rules.  The specified packages will then be displayed in the°dONLNd,é~ö* Ylist with any nested packages (with their showsOnCustom flag set) shown as selectable sub°dONLNdÖéö(ó-°dONLNdÜö~¶.(£~cpackages.  It is then up to the user to select the desired packages and click the Install or Remove°dONLNdͶ~≤ù* button.°dONLNdÚ∫~Δ*[To aid the user in deciding which items to select, an optional Get Info-style window can be°dONLNdNΔ~“%* `supplied by scriptwriter that provides the icon, total size, version, date and information text.ˇ>dˇ ˇˇˇˇd
  4243. d, Palatino
  4244. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4245.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú28
  4246. °dONLNdQ~],(Z~^To enable the Get Info window for the item, you need only to create a Package Comment resource°dONLNd_]~iG* -(‘icmt’) and reference this from the package.
  4247. °dONLNdç}~å*"Atom Execution Order"°∂ ã|ã0°∂°∂
  4248. °dONLNd¢ê~ú%*^Once the user clicks the Install or Remove button all specified packages are decomposed into a°dONLNdú~®* `flat list of atoms.  Therefore, the order the Installer executes the atoms is unrelated to their°dONLNdb®~¥* `position in the package’s part list.  Prior to installation the Installer groups File, Resource,°dONLNd√¥~¿+* ^Font, ResMerge, and Folder Atoms based on the source disk they reference.  Those atoms that do°dONLNd"¿~Ã≈* Jnot need source disks (atoms that delete on install) are grouped together.°dONLNdo‘~‡“*MFor each source disk the Installer executes the atoms in the following order:,
  4249.  
  4250. Zapf Dingbats
  4251.     °dONLNdΩÍ~ÛÖ*n
  4252. °dONLNdøËêÙ–)
  4253. Folder Atoms.
  4254.     °dONLNdÕ˛~Ö(~n
  4255. °dONLNdœ¸ê$)YFile Atoms.  This allows you to overwrite a file copied with a Folder Atom on the same or°dONLNd)êÌ* previous source disk.
  4256.     °dONLNd?~'Ö(%~n
  4257. °dONLNdAê(()[ResMerge Atoms.  This allows you to add or replace additional resources to a file copied on°dONLNdù(ê4#* !the same or previous source disk.
  4258.     °dONLNdø>~GÖ(E~n
  4259. °dONLNd¡<êH+)]Resource Atoms.  This allows you to add or replace a resource in a file copied with a Folder,°dONLNdHêTò* :File or ResMerge Atom on the same or previous source disk.
  4260.     °dONLNdZ^~gÖ(e~n
  4261. °dONLNd\\êhΔ) Font Atoms.°dONLNdhp~|(y~]Although the Installer will consistently order the atoms of a specific type, the scriptwriter°dONLNdΔ|~à)* \should never depend on this ordering, except for Action Atoms which are always guaranteed to°dONLNd#à~î(* 'be ordered by their ‘inaa’ resource ID.°dONLNdMú~® *]To ensure that the source disks will always be copied in the same order, include a Disk Order°dONLNd´®~¥* !resource (‘indo’) in your script.
  4262. °dONLNdÕÃ6‡÷(€6Package Reference
  4263. °dONLNdflÒ6Ù*"Package Resource Description"°∂ ‡4‡0°∂°∂"°∂ 40°∂°∂
  4264. °dONLNd¸~—+HPackages have an ,
  4265. Courier°dONLNd
  4266. —ı)S'inpk'°dONLNdı∫)$- resource type.  Its template is shown below.°dONLNdA~"®(~#define°dONLNdI¥"¸)6 PackageFlags°dONLNd\z"Ä)Δ\°dONLNd_!ê-∫(*êboolean°dONLNdg!Δ-ò)6#doesntShowOnCustom, showsOnCustom; °dONLNdã!û-§)ÿ\°dONLNdé,ê8∫(5êboolean°dONLNdñ,Δ8V)6notRemovable, removable;°dONLNd∞,z8Ä)¥\°dONLNd≥7êC∫(@êboolean°dONLNdª7ΔCÄ)6forceRestart, dontForceRestart;°dONLNd€7åCí)Δ\°dONLNdfiBêNÿ(Kê fill bit[13]°dONLNdÎBÍN>)Z/* Reserved */°dONLNd˙X~dÃ(a~
  4267. type 'inpk' {°dONLNd    cêo¿+ switch {°dONLNdn¢z+
  4268. case format0:°dONLNd%y¥Ö+ key integer = 0;°dONLNd9yVÖ˛)¢/* Package Format version */°dONLNdYÑ¥ê(ç¥
  4269. PackageFlags;°dONLNdkÑVê»)¢/* Package Flags */°dONLNdÇè¥õ(ò¥unsigned integer;°dONLNdóèVõ)¢/* Package Comment Rsrc ID */°dONLNd∏ö¥¶(£¥unsigned longint;°dONLNdÕöV¶¬)¢/* Package Size */°dONLNd„•¥±(Æ¥EvenPaddedString;°dONLNd¯•V±¬)¢/* Package Name */°dONLNd∞¥º§(π¥(unsigned integer = $$CountOf(PartsList);°dONLNd;ª¥«8* wide array PartsList {°dONLNdSªV«∂)¢/* Parts List */°dONLNdgΔ¥“¸(œ¥    RsrcType;°dONLNdxΔV“∞)¢/* Part Type */°dONLNdã—¥›(⁄¥
  4270.    RsrcID;°dONLNdõ—V›§)¢
  4271. /* Part ID */ˇ¬dˇ ˇˇˇˇd
  4272. d, Palatino
  4273. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4274.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú29,
  4275. Courier
  4276. °dONLNdQ¥]¿(Z¥};°dONLNd\êhú(eê};°dONLNdg~sä(p~};
  4277.     °dONLNd
  4278. É~é‘*Flag descriptions
  4279. °dONLNdë~ù>* showsOnCustom/doesntShowOnCustom°dONLNd=ë>ù@)¿ °dONLNd@ú®$(•;Determines if the package should be displayed in the Custom°dONLNd|®¥B*
  4280. Install list.°dONLNdãº~»(≈~removable/notRemovable °dONLNd£º» )ê8Determines if the package should be added to the list of°dONLNd‹»‘'* ;packages to be removed when the user has clicked the Remove°dONLNd‘‡&* :button.  When used with the showsOnCustom flag, determines°dONLNdS‡Ï * =if the package is selectable in the Custom Remove list.  Note°dONLNdëϯÑ* that you must also set the °dONLNd¨Ïѯ)vdeleteWhenRemoving°dONLNdæÏ¯$)l  flag on any°dONLNdÀ¯(;File, Resource or Font Atoms that are to be removed and you°dONLNdF*
  4281. must set the °dONLNdFà)8 actOnRemove°dONLNdà-)B% flag in any Action Atoms that are to°dONLNdE:(
  4282. be called.°dONLNdQ$0*8To include an package as a selectable item within Custom°dONLNdä0<* 8Remove, it is necessary to also include the package as a°dONLNd√<H(* @selectable item in Custom Install. There is no option to display°dONLNdHT* ;a package as a selectable item in Custom Remove, but not in°dONLNd@T`* ;Custom Install. You may however choose to do nothing if the°dONLNd|`l&* >package is a selected item within Custom Install, and only act°dONLNdªlx$* ;on that selected package during Custom Remove, but this may°dONLNd˜xÑw* be confusing to the user.°dONLNdå~ò,(ï~forceRestart/dontForceRestart°dONLNd0ó£-+ê BDetermines if the Installer should force the user to restart their°dONLNds£Ø'* <Macintosh after installing or removing this package when the°dONLNd∞تÛ* 4currently active System Folder is a target.  Use the°dONLNdª«V* forceRestart°dONLNdÒªV«)H/ flag if the installation requires rebooting to°dONLNd!«”(–:gain functionality, or if the package makes changes to the°dONLNd\”flE* System file.
  4283.     °dONLNdiÈ~Ù◊(Ò~Field descriptions
  4284. °dONLNd}˜~*Package Comment Rsrc ID°dONLNdñ+ê ;The resource ID of a package comment resource that displays°dONLNd“"* @the package’s size, date, version and a brief description of its°dONLNd&(* >contents or what it does.  It’s recommended that every package°dONLNdR&2* =shown in the Custom Install list have a comment resource.  If°dONLNdê2>$* =you do not wish to provide a package comment, place a zero in°dONLNdŒ>J+* Bthis field.  There are two types of comment resources.  The first,°dONLNdJV* ?an ‘icmt’ resource, provides basic information in one resource.°dONLNdRVb* 9The newer ‘inpc’ resource supports the RAM Size field and°dONLNdåbn˘* 5references a ‘TEXT’ resource that allows up to 32K of°dONLNd¬nzà* information text.  (2-bytes)°dONLNdflÇ~éÃ(ã~
  4285. Package Size °dONLNdÌÇé$)ê=The size of all atoms and packages contained in this package.°dONLNd,éö+* >This value is used to display in the comment window as well as°dONLNdkö¶ * 7provide the estimated selection size provided in Custom°dONLNd£¶≤!* @Install.  The Installer does not use this field to determine the°dONLNd‰≤æ!* =actual disk space requirements of the target hard disk during°dONLNd    "æ -* ?preflighting.  Individual atom sizes are summed to determine if°dONLNd    b ÷Ú* 5sufficient target disk space is available.  (4-bytes)ˇ4dˇ ˇˇˇˇd
  4286. d, Palatino
  4287. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4288.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú30,
  4289. Courier
  4290. °dONLNdQ~]Δ(Z~ Package Name°dONLNd QΔ]»)H °dONLNdQ])H;The name to be displayed in the Custom Install list.  (even°dONLNdIQ](Z-°dONLNdJ]iq(fpadded Pascal string)°dONLNdaq}-*@If the Package Name field is a single dash character (-), a gray°dONLNd¢}â)* @horizontal line appears in the list of packages.  This dash line°dONLNd„âï"* Ais similar to the one found for menu resources.  This line can be°dONLNd%ï°#* >used to separate the items which can be installed into logical°dONLNdd°≠* >groups.  If a package is used just for displaying a separation°dONLNd£≠π¿* *line, all of the other fields are ignored.°dONLNd–¡Õ∏*$Below is a sample gray-line package:°dONLNd¯’·*r°dONLNd˘’·‰)#esource 'inpk' (1, "dashed line") {°dONLNd·2Ìh+      format0 {°dONLNd*ÏV¯™+$ showsOnCustom,°dONLNd;˜V§*
  4291. notRemovable,°dONLNdKVº* dontForceRestart,°dONLNd_
  4292. Vb* 0,°dONLNdb
  4293. z˛)$/* Pkg Cmnt Rsrc ID */°dONLNd{V$b(!V0,°dONLNd~z$Ê)$/* Package size */°dONLNdì#V/n(,V"-",°dONLNdò#z/Ê)$/* Package Name */°dONLNd≠.V:‡(7V{} /* empty brackets */°dONLNdΔ92E8(B2}°dONLNd»DP(M};°dONLNdÀW~c¥(`~    Part List°dONLNd‘W¥c∂)6 °dONLNd÷Wc)Z7The type and resource ID of each part contained in this°dONLNdcofl* 0package.  (4-bytes + 2-bytes for each list item)
  4294. °dONLNd?É6ì6(è6$Package Comment Resource Description"°∂ ì4ì0°∂°∂
  4295. °dONLNddò~§ˇ+HTVisible packages should reference one of two comment resources to provide additional°dONLNdπ§~∞* [information to the user about the packages they might want to install or remove.  The older°dONLNd∞~º* \‘icmt’ is supported, but cannot specify the RAM Size field.  The new ‘inpc’ comment resource°dONLNdrº~»&* _must reference a ‘TEXT’ resource that contains the text to display at the bottom of the package°dONLNd“»~‘b* 1info window.  Both templates are described below.
  4296. °dONLNdË6ˆ4(Ú6(New Package Comment Resource Description"°∂ ˆ4ˆ0°∂°∂
  4297. °dONLNd-~Ã+H
  4298. type 'inpc' {°dONLNdBV˛)ÿ* New Custom Item comment */°dONLNda
  4299. ¢“(¢switch {°dONLNdm¥$+
  4300. case format1:°dONLNd#Δ/&+ key integer = 1;°dONLNdí#V/)ê /* Custom Item Format version */°dONLNd∑.Δ:D(7Δunsigned hex longint;°dONLNdÕ.V:⁄)ê/* Custom Item Date */°dONLNdË9ΔED(BΔunsigned hex longint;°dONLNd˛9VEÏ)ê/* Custom Item Version */°dONLNdDΔPD(MΔunsigned hex longint;°dONLNd2DVP")ê"/* Custom Item RAM Requirements */°dONLNdYOΔ[(XΔrsrcID;°dONLNdfOV[Ï)ê/* Custom Item Icon ID */°dONLNdÑZΔf(cΔrsrcID;°dONLNdëZVf")ê"/* Custom Item Desc. ('TEXT' ID)*/°dONLNd∂e¢qÆ(n¢};°dONLNdπp~|ä(y~};
  4301.     °dONLNdºå~ó◊*Field descriptions
  4302. °dONLNd–ö~¶fi*Custom Item Date°dONLNd‡öfi¶‡)` °dONLNd‚ö¶)0;The release date of the package.  The value is specified in°dONLNd¶≤ı* 6seconds since January 1, 1904.  The Installer uses the°dONLNdU≤æ* <IUDateString toolbox call to get the string to display.  See°dONLNdíæ ã* Inside Macintosh Volume II°dONLNd¨æã Ã)}, page 377 and °dONLNdªæÃ )AInside Macintosh°dONLNdà÷:(”    Volume I,°dONLNd’ :÷ì), page 504.  (4-bytes)ˇƒdˇ ˇˇˇˇd
  4303. d, Palatino
  4304. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4305.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú31,
  4306. Courier
  4307. °dONLNdQ~]ˆ(Z~Custom Item Version °dONLNdQ],)ê?The version number of this package.  The Installer can decipher°dONLNdU]ij* two version formats:°dONLNdkq}ñ*Binary coded decimal number.°dONLNdáqñ}%)à!  The ones digit is the secondary°dONLNd©}â%(ÜCrevision (0 to 9), the tens digit is the primary revision (0 to 9),°dONLNdÌâï* 7and all greater digits make up the version number.  For°dONLNd%ï°* ?example, 100 is version 1.0, 290 is version 2.9, 605 is version°dONLNde°≠* <6.0.5, and 5704 is version 57.0.4.  The Installer knows this°dONLNd¢≠π* <format because it will always be less than 10000.  (4-bytes)°dONLNd‡¡Õ∞*#‘vers’ resource hexadecimal number.°dONLNd¡∞Õ)¢  See the definition of°dONLNdÕŸÌ(÷4‘Version’ in the “InstallerTypes.r” file.  (4-bytes)°dONLNdP·~Ì&(Í~Custom Item RAM Requirements°dONLNdl·&Ì()® °dONLNdoϯ(ı7The estimated RAM needs of this package.  The Installer°dONLNd߯* :displays this value in the package information window.  (4°dONLNd·¯(-°dONLNd‚*(
  4308. bytes)°dONLNdÈ~$(!~Custom Item Icon ID°dONLNd¸$Ú)r °dONLNd˛$á)The ID of the appropriate °dONLNdá$)yICON, ICN#, icl4 and/or°dONLNd0$0&(-icl8°dONLNd4$&0$): resources. The ID must be 1024 or greater (IDs below this°dONLNdo0<(9=range are reserved).  If the script contains these icons, the°dONLNd≠<H* <appropriate one is displayed in the upper left corner of the°dONLNdÍHT¬* &package information window.  (2-bytes)°dONLNd\~h(e~Custom Item Description°dONLNd(\h
  4309. )ä °dONLNd+gs*+ @The ID of a ‘TEXT’ resource containing the text to appear in the°dONLNdls)* =comment section of the package information window.  It should°dONLNd™ã* :describe the package and provide any information that will°dONLNdÂãó* =help the user decide if installing or removing the package is°dONLNd#ó£$* @appropriate.  Styled text is not currently supported.  (2-bytes)
  4310. °dONLNdd∑6≈-(¡6(Old Package Comment Resource Description"°∂ ≈4≈0°∂°∂
  4311. °dONLNdç—~›Ã+H
  4312. type 'icmt' {°dONLNd°‹¢Ë +$ unsigned hex longint;°dONLNd∑‹2Ëû)ê/* Release Date */°dONLNdÃÁ¢Û (¢unsigned hex longint;°dONLNd‚Á2Û§)ê/* Version Number*/°dONLNd¯Ú¢˛Ã(˚¢RsrcID;°dONLNdÚ2˛Ä)ê
  4313. /* Icon ID */°dONLNd˝¢    (¢EvenPaddedString;°dONLNd)˝2    Œ)ê/* Package Comment Text */°dONLNdD~ä(~};
  4314.     °dONLNdG$~/◊*Field descriptions
  4315. °dONLNd[2~>Δ* Release Date°dONLNdg2Δ>»)H °dONLNdi2>)H;The release date of the package.  The value is specified in°dONLNd•>Jı* 6seconds since January 1, 1904.  The Installer uses the°dONLNd‹JV* <IUDateString toolbox call to get the string to display.  See°dONLNdVbã* Inside Macintosh Volume II°dONLNd3VãbÃ)}, page 377 and °dONLNdBVÃb)AInside Macintosh°dONLNdSbn:(k    Volume I,°dONLNd\b:nì), page 504.  (4-bytes)°dONLNdrv~Çÿ(~Version Number °dONLNdÇvÇ,)ê?The version number of this package.  The Installer can decipher°dONLNd¬Çéj* two version formats:°dONLNdÿñ¢ñ*Binary coded decimal number.°dONLNdÙññ¢%)à!  The ones digit is the secondary°dONLNd¢Æ%(´Crevision (0 to 9), the tens digit is the primary revision (0 to 9),°dONLNdZÆ∫* 7and all greater digits make up the version number.  For°dONLNdí∫Δ* ?example, 100 is version 1.0, 290 is version 2.9, 605 is version°dONLNd“Δ“* <6.0.5, and 5704 is version 57.0.4.  The Installer knows this°dONLNd    “fi* <format because it will always be less than 10000.  (4-bytes)ˇûdˇ ˇˇˇˇd
  4316. d, Palatino
  4317. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4318.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú32
  4319. °dONLNdQ]∞(Z#‘vers’ resource hexadecimal number.°dONLNd#Q∞])¢  See the definition of°dONLNd;]iÌ(f4‘Version’ in the “InstallerTypes.r” file.  (4-bytes),
  4320. Courier°dONLNdpq~}®(z~Icon ID°dONLNdwq®}™)* °dONLNdyq}á)fThe ID of the appropriate °dONLNdìqá})yICON, ICN#, icl4 and/or°dONLNd´}â&(Üicl8°dONLNdØ}&â$): resources. The ID must be 1024 or greater (IDs below this°dONLNdÍâï(í=range are reserved).  If the script contains these icons, the°dONLNd(ï°* <appropriate one is displayed in the upper left corner of the°dONLNde°≠∂* "Package Comment window.  (2-bytes)°dONLNdàµ~¡ˆ(æ~Package Comment Text°dONLNdúµˆ¡¯)x °dONLNdûµ¡')<The text which appears in the comment section of the Package°dONLNd€¡Õ* 8Comment.  It should describe the package and provide any°dONLNdÕŸ* ;information that will help the user decide if installing or°dONLNdPŸÂ* 9removing the package is appropriate.  (even-padded Pascal°dONLNdäÂÒ,* string)
  4321. °dONLNdí    6›(6About the File Atom"°∂ 40°∂°∂
  4322. °dONLNd¶"~.+H`The File Atom should be used to copy or delete one or both forks of a file.  Two versions of the°dONLNd.~:* ]File Atom script resource are understood by Installer 4.0, but it is recommended that you use°dONLNde:~F * format version 1.°dONLNdwN~ZÌ*RThe File Atom provides the following major features for copying or deleting files:,
  4323.  
  4324. Zapf Dingbats
  4325.     °dONLNd d~mÖ*n
  4326. °dONLNdÃbênk)3Ability to update a file only if it already exists.
  4327.     °dONLNdx~ÅÖ(~n
  4328. °dONLNdvêÇ0)%Ability to preserve an existing file.
  4329.     °dONLNd(å~ïÖ(ì~n
  4330. °dONLNd*äêñ)]Ability to preserve a newer file based on its creation date, ‘vers’ 1 resource or custom code°dONLNdàñê¢æ*
  4331. you write.
  4332.     °dONLNdì¨~µÖ(≥~n
  4333. °dONLNdï™ê∂T),Decompression of a file during installation.
  4334.     °dONLNd¬¿~…Ö(«~n
  4335. °dONLNdƒæê !)YAutomatically unlock the file before replacing or deleting, and/or lock the file when the°dONLNd ê÷˝* installation is finished.
  4336.     °dONLNd8‡~ÈÖ(Á~n
  4337. °dONLNd:fiêÍ•)?Install a file that has been split among multiple source disks.°dONLNdzÚ~˛(˚~[If you are simply copying hundreds of uncompressed files and do not wish to create separate°dONLNd÷˛~
  4338. µ* EFiles Atoms for each, you might be able to use a Folder Atom instead.
  4339. °dONLNd"66(16Using the File Atom (‘infa’)"°∂ 6460°∂°∂
  4340. °dONLNd9;~G +H`The new version of the File Atom provides for large source files to be split across installation°dONLNdöG~S˛* Zdisks, then joined into one file on the target disk during the installation.  In addition,°dONLNdıS~_* [compressed source files can be decompressed during the installation using an Atom Extender.
  4341. °dONLNdQs~Ç**"Comparing Files by Version"°∂ Å|Å0°∂°∂
  4342. °dONLNdlÜ~í*\Two new fields in the File Atom allow the scriptwriter to compare the source and target file°dONLNd…í~û#* ausing their version number, instead of only using their creation date.  The first field holds the°dONLNd+û~™* Ysource file’s version number, and the second field holds the resource ID of a new Version°dONLNdÖ™~∂.* aCompare (‘invc’) script resource.  The Version Compare script resource allows the scriptwriter to°dONLNdÁ∂~¬√* Kcall a code resource that calculates the version number of the target file.°dONLNd    4 ~÷*[To compare the newness of the target and source using the old creation date method, use the°dONLNd    ê÷~‚¸* useSrcCrDateToCompare°dONLNd    •÷¸‚)~B flag.  To compare using the version number in the target’s ‘vers’ˇ*dˇ ˇˇˇˇd
  4343. d, Palatino
  4344. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4345.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú33
  4346. °dONLNdQ~]ˆ(Z~ID=1 resource then use the ,
  4347. Courier°dONLNdQˆ]n)xuseVersProcToCompare°dONLNd/Qn])x) flag and place a 0 (zero) in the Version°dONLNdY]~i(f~YCompare Rsrc ID field.  If the version number is stored somewhere besides the ‘vers’ ID=1°dONLNd≥i~u* \resource then you’ll need to create and attach a Version Compare script resource to the File°dONLNdu~Åö* Atom.°dONLNdâ~ïÀ*Using either the °dONLNd'âÀïI)MuseSrcCrDateToCompare°dONLNd<âIïV)~ or °dONLNd@âVïŒ)
  4348. useVersProcToCompare°dONLNdTâŒï)x flag presents the°dONLNdgï~°-(û~fidentical interface to the user if the source file is older than the target file.  See the description°dONLNdŒ°~≠õ* of the °dONLNd’°õ≠)leaveAloneIfNewer°dONLNdʰ≠ø)f+ flag in the “File Atom Reference” section.
  4349. °dONLNd¡~–X(Ã~#Using Split Sources with File Atoms"°∂ œ|œ0°∂°∂
  4350. °dONLNd6‘~‡!*bThe new ‘infa’ script resource contains a source list that holds zero or more references to source°dONLNdô‡~Ï* dfiles.  If the original source file must be split into smaller files, an entry for each split source°dONLNd˛Ï~¯$* `piece should be placed into the source list.  Each entry contains information about the location°dONLNd_¯~%* eof the source file (‘infs’ ID), the target size of the resource fork piece and the target size of the°dONLNd≈~Δ* data fork piece.°dONLNd÷~$-*cEach target size field must contain the exact size the source piece will appear in the target file.°dONLNd;$~0!* ]If the piece is being decompressed with an Atom Extender during installation, then this field°dONLNdô0~<* `must contain the uncompressed size of the piece. If only one fork is requested to be copied, the°dONLNd˙<~H** gtarget size field of the other fork is ignored.  Place a zero in a fork’s target size field if the fork°dONLNdbH~T * contains no data.
  4351.     °dONLNdt^~iö*NOTE
  4352. °dONLNdyl~x'*cThe order of the entries in the source list is important.  Each piece will be written to the target°dONLNd›x~ÑP* 2file in the same order as it appears in the list. ,
  4353.  
  4354. Zapf Dingbats
  4355.     °dONLNdzPÉW)“u
  4356. °dONLNdò~ßj(£~$Using Atom Extenders with File Atoms"°∂ ¶|¶0°∂°∂
  4357. °dONLNd6´~∑
  4358. *UUsing Atom Extenders with the new File Atom (Format 1) allows scriptwriters to easily°dONLNdå∑~√#* \decompress files that have been compressed on the source installation disk.  Attach the Atom°dONLNdÈ√~œ˙* XExtender to the File Atom file by entering the ID of the ‘inex’ script resource into the°dONLNdBœ~€)* cappropriate field in the ‘infa’.  The code resource referenced from the ‘inex’ script resource will°dONLNd¶€~Á * [be called at the desired point in the installation so it can read the compressed file data,°dONLNdÁ~Ûk* 6decompress the data, then write it to the target file.
  4359.     °dONLNd9˝~ö*NOTE
  4360. °dONLNd> ~$*^You should never create a source file that has a compressed resource fork, because any attempt°dONLNdù~#* \to access the resource fork by the Finder or other application may crash the Macintosh.  The°dONLNd˙#~/\* %rsrcForkInRsrcFork/rsrcForkInDataFork°dONLNd    #\/#)fi+ flag has been added to designate where the°dONLNd    K/~; (8~"resource fork is stored.  Use the °dONLNd    m/ ;w)çrsrcForkInDataFork°dONLNd    /w;    )l flag when copying a compressed°dONLNd    ü;~Gπ(D~Kresource fork that is stored in the data fork of the source file.  Use the °dONLNd    Í;πG%(DπrsrcForkInRsrcFork°dONLNd    ˝G~Sa(P~2flag when copying a non-compressed resource fork. 
  4361.     °dONLNd
  4362. /IaRh)„u
  4363. °dONLNd
  4364. 1[~g#(d~^When the Installer is preparing to install, each File Atom is expanded into one or more parts.°dONLNd
  4365. ëg~s)* ^As each part is installed, the Atom Extender attached to the original File Atom will be called°dONLNd
  4366. s~.* dfor each part.  When only one source file is specified there is one part for each fork being copied.°dONLNd V~ã* ]When split source pieces are specified there is one part for each fork being copied from each°dONLNd ¥ã~óô* piece.°dONLNd ªü~´ *UThe goal of the new File Atom and Atom Extender is to provide compatibility with most°dONLNd ´~∑* Xpopular compressed source file configurations.  Several configurations are listed below.ˇídˇ ˇˇˇˇd
  4367. d, Palatino
  4368. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4369.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú34,
  4370.  
  4371. Zapf Dingbats
  4372. °dONLNdS~\Ö(Z~n
  4373. °dONLNdQê]*)]The simplest source file configuration is for each compressed fork to be placed into the data°dONLNd`]êi!* Zfork of two separate files.  The Installer will call the Atom Extender separately for each°dONLNdªiêu¶* fork.
  4374.     °dONLNd¡~àÖ(Ü~n
  4375. °dONLNd√}êâ%)]Another source file configuration places both forks into the same data fork of a source file,°dONLNd!âêï-* [with a header describing the format of the data.  The Atom Extender will be called once for°dONLNd}ïê° * [each fork copied, but will be responsible for finding, reading and writing the correct data°dONLNdŸ°ê≠)* Yfor the specified fork.  The Atom Extender parameter block will provide information about°dONLNd3≠êπ
  4376. * which fork is being copied.
  4377.     °dONLNdO√~ÃÖ( ~n
  4378. °dONLNdQ¡êÕ)YAn “Archived” source file configuration contains multiple compressed files (and forks) in°dONLNd´ÕêŸ%* \one source file.  One File Atom must be created for each target file being copied, with each°dONLNdŸê * Zreferring to the same source file (‘infs’). The Atom Extender parameter block will contain°dONLNdcÂêÒ$* Xinformation about the current file (and fork) being copied, with which the Atom Extender°dONLNdºÒê˝* Vwill find, read, decompress and write the proper target file’s data.  Our InstaCompOne°dONLNd˝ê    d* -Atom Extender is an example of this approach.°dONLNdA~˚(~UFor those source configurations that cannot be accommodated by the built-in routines,°dONLNdó~)* [scriptwriters can use the supplied parameter block to perform the copy by themselves.  This°dONLNdÛ)~5Ä* 8strategy should only be taken when absolutely necessary.
  4379. °dONLNd,I~X?*"Installing a Custom Folder Icon"°∂ W|W0°∂°∂
  4380. °dONLNdM\~h*^The File Atom can easily be used to set the custom icon of any folder on the target disk.  The°dONLNd¨h~t* _Installer notices if the scriptwriter is copying the special invisible “Icon\n” file, and if so°dONLNd t~Äñ* ?automatically sets the userCustomIcon bit on its parent folder.°dONLNdLà~î¡*GThere are several key points to remember when installing a custom icon:
  4381.     °dONLNdîû~ßÖ*n
  4382. °dONLNdñúê®Ì)PSince the Installer does not remove the special “Icon\n” file correctly, use the,
  4383. Courier°dONLNdÁ®ê¥* dontDeleteWhenRemoving°dONLNd˝®¥í)Ñ flag to prevent its removal.
  4384.     °dONLNdæ~«Ö(≈~n
  4385. °dONLNdºê»ä)<It’s polite to preserve an existing custom icon, so use the °dONLNdZºä»“)˙ copyIfUpdate°dONLNdfº“»Í)H flag.
  4386.     °dONLNdm“~€Ö(Ÿ~n
  4387. °dONLNdo–ê‹*)_The Installer will install the custom icon even if the directory  is the root level of the hard°dONLNdœ‹êË-* [disk.  We discourage scriptwriters from recommending the root level of the hard disk as the°dONLNd+ËêÙt* 7target folder, but user’s can select it if they choose.
  4388. °dONLNdc 6 ·(6File Atom Reference"°∂  4 0°∂°∂
  4389. °dONLNdw%~1ÿ+HQThis section describes the resource description of the ‘infa’ resource, format 1.
  4390. °dONLNd…E6UΩ(Q6Resource Description"°∂ U4U0°∂°∂
  4391. °dONLNdfib~n®+H#define°dONLNdÊb¥n)6
  4392. fileAtomFlags°dONLNd    b
  4393. n(k
  4394. \°dONLNd    m¢yÃ(v¢boolean°dONLNd    mÍyÏ)H+dontDeleteWhenRemoving, deleteWhenRemoving;°dONLNd    <m
  4395. y(v
  4396. \°dONLNd    @x¢ÑÃ(Å¢boolean°dONLNd    IxÍÑ)H/dontDeleteWhenInstalling, deleteWhenInstalling;°dONLNd    yx
  4397. Ñ(Å
  4398. \°dONLNd    }É¢èÃ(å¢boolean°dONLNd    ÜÉÍèD)HdontCopy, copy;°dONLNd    †É
  4399. è(å
  4400. \°dONLNd    §é¢ö‰(ó¢ fill bit[3]°dONLNd    ∞éÍö>)H/* Reserved */°dONLNd     é
  4401. ö(ó
  4402. \°dONLNd    Œô¢•Ã(¢¢boolean°dONLNd    ◊ôÍ•‘)H'dontIgnoreLockedFile, ignoreLockedFile;°dONLNd
  4403. ô
  4404. •(¢
  4405. \°dONLNd
  4406. §¢∞Ã(≠¢boolean°dONLNd
  4407. §Í∞∂)H"dontSetFileLocked, setFileLocked; °dONLNd
  4408. 5§
  4409. ∞(≠
  4410. \°dONLNd
  4411. 9Ø¢ªÃ(∏¢boolean°dONLNd
  4412. BØÍª¯)H-useSrcCrDateToCompare, useVersProcToCompare; °dONLNd
  4413. pØ
  4414. ª(∏
  4415. \°dONLNd
  4416. t∫¢ΔÃ(√¢boolean°dONLNd
  4417. }∫ÍΔ§)HsrcNeedExist, srcNeedNotExist; °dONLNd
  4418. ¢∫
  4419. Δ(√
  4420. \°dONLNd
  4421. ¶≈¢—Ã(Œ¢boolean°dONLNd
  4422. Ø≈Í—⁄)H(rsrcForkInRsrcFork, rsrcForkInDataFork; °dONLNd
  4423. ⁄≈
  4424. —(Œ
  4425. \°dONLNd
  4426. ‹–~‹Ñ(Ÿ~ °dONLNd
  4427. fl–¢‹Ã)$boolean°dONLNd
  4428. Ë–Í‹»)H%updateEvenIfNewer, leaveAloneIfNewer;°dONLNd –
  4429. ‹(Ÿ
  4430. \ˇ¢dˇ ˇˇˇˇd
  4431. d, Palatino
  4432. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4433.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú35,
  4434. Courier
  4435. °dONLNdQ¢]Ã(Z¢boolean°dONLNd    QÍ]ò)HupdateExisting, keepExisting;°dONLNd-Q
  4436. ](Z
  4437. \°dONLNd1\¢hÃ(e¢boolean°dONLNd:\Íh™)H copyIfNewOrUpdate, copyIfUpdate;°dONLNd`\
  4438. h(e
  4439. \°dONLNddg¢sÃ(p¢boolean°dONLNdmgÍsh)HnoRsrcFork, rsrcFork;°dONLNdãg
  4440. s(p
  4441. \°dONLNdèr¢~Ã({¢boolean°dONLNdòrÍ~b)HnoDataFork, dataFork°dONLNd±ë~ùÃ(ö~
  4442. type 'infa' {°dONLNd¡ú¢®“+$ switch {°dONLNdÕߥ≥+
  4443. case format1:°dONLNdfl≤Δæ&+ key integer = 1;°dONLNdÙ≤zæ)¥/* File Atom version */°dONLNdΩΔ… (ΔΔfileAtom1Flags;°dONLNd$Ωz…¯)¥/* File Atom Flags */°dONLNd>»Δ‘,(—Δunsigned longInt;°dONLNdT»z‘")¥/* Total Target File Size */°dONLNdu”Δfl,(‹Δunsigned integer;°dONLNdã”zfl")¥/* Finder Attribute Flags */°dONLNd¨fiΔÍ(ÁΔ fileSpecID;°dONLNdæfizͲ)¥/* Tgt file spec ID */°dONLNdŸÈΔıt(ÚΔinteger = $$CountOf (Pieces);°dONLNd˜Èzı()¥/* Number of Source Pieces */°dONLNdÙΔ8(˝Δwide array Pieces {°dONLNd2ˇÿ + fileSpecID;°dONLNdBˇh Ê)ê/* Source File Spec*/°dONLNd]
  4444. ÿ>(ÿunsigned longInt;°dONLNdq
  4445. h()ê /* Target Data Fork Part Size */°dONLNdóÿ!>(ÿunsigned longInt;°dONLNd´h!()ê /* Target Rsrc Fork Part Size */°dONLNd– Δ,“()Δ};°dONLNd◊+Δ7,* unsigned longint;°dONLNdÏ+h7
  4446. )¢/* Source Version Number */°dONLNd 6ΔB(?ΔrsrcID;°dONLNd6hB)¢/* Version Compare Rsrc ID */°dONLNd<AΔM(JΔrsrcID;°dONLNdJAhM
  4447. )¢/* Atom Extender Rsrc ID */°dONLNdjLΔX,(UΔevenPaddedString;°dONLNdLhXÏ)¢/* Atom Description */°dONLNdòW¢cÆ(`¢};°dONLNdõb~nä(k~};
  4448.     °dONLNdû~~â’*Flag Descriptions
  4449. °dONLNd∞å~òt*)deleteWhenRemoving/dontDeleteWhenRemoving°dONLNd€ó£++ê ?Determines if the file is deleted during a removal.  When using°dONLNd£Ø * the °dONLNd£ Øå)deleteWhenRemoving°dONLNd1£åØ )l$ flag, if the target file exists and°dONLNdVت(∏@the user clicks Remove, the target file is deleted.  If the file°dONLNdóª«#* Bdoes not exist on the target disk, this flag is ignored.  The file°dONLNd⁄«”ÿ* -atom must be part of a package that uses the °dONLNd«ÿ”)     removable°dONLNd«”&)6 flag.°dONLNd”fl˚(‹4Note that of the following File Atom flags, only the°dONLNdMflÎÄ* rsrcFork/noRsrcFork°dONLNd`flÄÎï)r and °dONLNdeflïÎ)dataFork/noDataFork°dONLNdxflΠ)r flags°dONLNdΘ¿(Ù'have any effect on the removal process.°dONLNdߡ~ å(~-deleteWhenInstalling/dontDeleteWhenInstalling°dONLNd’
  4450. +ê ;Determines if a file is deleted during an installation when°dONLNd"9*
  4451. using the °dONLNd9"i)+dontCopy°dONLNd#i"')0- flag.  Installer generally ignores this flag°dONLNdQ".T(+when using the °dONLNd`"T.l)Fcopy°dONLNdd"l.œ) flag.  When using the°dONLNd{.:Ü(7deleteWhenInstalling°dONLNdè.Ü:)x% flag, after the user clicks Install,°dONLNdµ:F(C>the target file is deleted if it exists, otherwise the flag is°dONLNdÙFRK* ignored.  The °dONLNdFKR√)=deleteWhenInstalling°dONLNdF√R()x flag is primarily used°dONLNd.R^ ([:for deleting previously installed files that are no longer°dONLNdi^j1* needed.°dONLNdqr~~Ã({~
  4452. copy/dontCopy°dONLNdr~)ê>Determines if the file is copied during an installation.  Note°dONLNdæ~äZ* that some flags (°dONLNdœ~Zä¿)LleaveAloneIfNewer°dONLNd‡~¿ä≈)f, °dONLNd‚~≈ä
  4453. ) keepExisting°dONLNdÓ~
  4454. ä)H,°dONLNdäñV(ì copyIfUpdate°dONLNd¸äVñ,)H.) can prevent copying from happening under the°dONLNd+ñ¢z(ücircumstances specified.°dONLNdF™~∂\(≥~%dontIgnoreLockedFile/ignoreLockedFile°dONLNdlµ¡˝+ê 6Determines if an existing locked target file should be°dONLNd£¡Õ* 6automatically unlocked before replacing.  Only use the°dONLNd⁄ÕŸn* ignoreLockedFile°dONLNdÍÕnŸ!)`* flag if you originally installed the fileˇVdˇ ˇˇˇˇd
  4455. d, Palatino
  4456. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4457.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú36
  4458. °dONLNdQ]fl(Z0locked or your software locks the file.  Use the,
  4459. Courier°dONLNd1]iÜ* dontIgnoreLockedFile°dONLNdE]Üi)x flag the majority of times to°dONLNddiuË(r1preserve the user’s control over their Macintosh.°dONLNdñ}~â8(Ü~dontSetFileLocked/setFileLocked°dONLNd∂àî+ê =Determines if the target file should be locked after copying.°dONLNdıî†!* Use °dONLNd˘î!†o)
  4460. setFileLocked°dONLNdîo†.)N- to request that the target file be locked at°dONLNd4†¨â(©the end of the installation.°dONLNdQ¥~¿z(Ω~*useSrcCrDateToCompare/useVersProcToCompare°dONLNd|øÀ'+ê >Determines how the Installer will determine if the target file°dONLNdªÀ◊Ï* 5is newer or older than the source file.  If using the°dONLNdÒ◊„å* useSrcCrDateToCompare°dONLNd◊å„ )~" flag the creation date entered in°dONLNd)„Ô'(Ï>the Source File Spec is compared with the creation date of the°dONLNdhÔ˚`* target file.  If the °dONLNd}Ô`˚ÿ)RuseVersProcToCompare°dONLNdëÔÿ˚)x flag is used, an°dONLNd£˚((?optionally supplied version function is called to determine the°dONLNd„* >version number of the target file.  See the description of the°dONLNd"ò* Version Compare Rsrc ID°dONLNd9ò¥)ä field.°dONLNdA'~3&(0~srcNeedExist/srcNeedNotExist°dONLNd^2>+ê ;Determines whether the source file must exist on the source°dONLNdö>J<* disk.  Use °dONLNd•><Jñ).srcNeedNotExist°dONLNd¥>ñJ&)Z" if the source file can optionally°dONLNd◊JV(S@reside on the source disk.  If the file is not found the atom is°dONLNdVbº* 'ignored and the installation continues.°dONLNd@j~v\(s~%rsrcForkInRsrcFork/rsrcForkInDataFork°dONLNdfuÅ+ê <Since a compressed resource fork should never be left in the°dONLNd£Åç#* Aresource fork of the source file, this allows the scriptwriter to°dONLNdÂçô* ;easily store the compressed resource fork in the data fork.°dONLNd"ô•* :These flags determine where the resource fork data will be°dONLNd]•±* :read from when using the ReadSourceData() routine.  If the°dONLNdò±Ωz* rsrcForkInDataFork°dONLNd™±zΩ%)l( flag is specified, the source data will°dONLNd”Ω…±(Δ$actually be read from the data fork.°dONLNd¯—~›P(⁄~#leaveAloneIfNewer/updateEvenIfNewer°dONLNd‹Ë)+ê >Determines what action the Installer should take if the target°dONLNd[ËÙ* =file is newer than the source file that is replacing it.  The°dONLNdôÙ(* ?method the Installer uses to determine the newness of the files°dONLNdŸ R* is based on the °dONLNdÈR –)DuseSrcCrDateToCompare°dONLNd˛– „)~ and°dONLNd Ü(useVersProcToCompare°dONLNd Ü…)x flags.  Use the°dONLNd($t(!updateEvenIfNewer°dONLNd9t$)f) flag if the version of this file must be°dONLNdc$0*(-@synchronized with specific versions of other files that are part°dONLNd§0<* =of the installation.  The alert displayed to the user depends°dONLNd‚<H* :whether the user is performing an Easy Install or a Custom°dONLNdHT0* Install.°dONLNd'\hI*Easy Install  °dONLNd5\Ihå);—  If using the °dONLNdE\åhÚ)CleaveAloneIfNewer°dONLNdV\Úh)f
  4461.  flag, the°dONLNdaht(q>user will not be notified and the newer will be preserved.  If°dONLNd†tÄ9*
  4462. using the °dONLNd™t9Äü)+updateEvenIfNewer°dONLNdªtüÄ)f flag, an alert is shown that°dONLNdŸÄå*(â@has two options:  Continue or Cancel.  Clicking Cancel will stop°dONLNd    åò&* >the installation, and clicking Continue will replace the newer°dONLNd    Yò§µ* 'target file with the older source file.°dONLNd    Ç¨∏P*Custom Install°dONLNd    ê¨P∏T)B  
  4463.     °dONLNd    íÆT∑a)—  
  4464. °dONLNd    ï¨a∏ñ)
  4465.  
  4466. If using the °dONLNd    ¢¨ñ∏¸)5leaveAloneIfNewer°dONLNd    ≥¨¸∏&)f
  4467.  flag, the°dONLNd    æ∏ƒ (¡8user will be presented with an alert that provides three°dONLNd    ˜ƒ–€* /choices:  Newer, Older or Cancel.  If using theˇ¬dˇ ˇˇˇˇd
  4468. d, Palatino
  4469. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4470.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú37,
  4471. Courier
  4472. °dONLNdQ]t(ZupdateEvenIfNewer°dONLNdQt],)f+ flag, the alert is the same as for an Easy°dONLNd=]i0(fInstall.°dONLNdGq~} (z~keepExisting/updateExisting°dONLNdc|à(+ê ?Allows the scriptwriter to preserve an existing file when using°dONLNd£àî * the °dONLNdßà î8)copy°dONLNd´à8î[) and/or °dONLNd≥à[îµ)#deleteOnInstall°dONLNd¬àµî")Z flag.  This might be the°dONLNd‹î†((ùAcase if you want to preserve a preference file that contains user°dONLNd†¨c* specific data.  Use °dONLNd2†c¨´)U keepExisting°dONLNd>†´¨.)H to prevent the Installer from°dONLNd]¨∏$(µAdisturbing an existing target file.  No copying will occur if the°dONLNdü∏ƒb* updateExisting°dONLNd≠∏bƒƒ)T flag is used with the °dONLNdƒ∏ƒƒ )b copyIfUpdate°dONLNd–∏ ƒ$)H flag.°dONLNd◊Ã~ÿ2(’~copyIfUpdate/copyIfNewOrUpdate°dONLNdˆ◊„+ê ;Allows the scriptwriter to update a file only if it already°dONLNd2„ÔÜ* exists when used with the °dONLNdL„ÜÔû)xcopy°dONLNdP„ûÔÕ)  flag.  Use °dONLNd\„ÕÔ)/ copyIfUpdate°dONLNdh„Ô )H to°dONLNdlÔ˚÷(¯.prevent a new file from being created. If the °dONLNdöÔ÷˚)» copyIfUpdate°dONLNdß˚n(flag is used with the °dONLNdΩ˚n∂)` keepExisting°dONLNd…˚∂))H flag then no copying will°dONLNd‰'(occur.°dONLNdÎ~'($~rsrcFork/noRsrcFork°dONLNdˇ'')êADetermines if the resource fork of the file is affected during an°dONLNdA'3í* installation or removal.  Use °dONLNd_'í3⁄)Ñ resourceFork°dONLNdk'⁄3&)H to copy or delete°dONLNd~3?(<?the entire resource fork of the file during an installation, or°dONLNdæ?K¸* 6delete the entire resource fork during a removal.  Use°dONLNdıKWb* noResourceFork°dONLNdKbW)T, to not touch the resource fork of the file.°dONLNd0_~k(h~dataFork/noDataFork°dONLNdD_k)ê=Determines if the data fork of the file is affected during an°dONLNdÇkwí* installation or removal.  Use °dONLNd†kíw¬)ÑdataFork°dONLNd®k¬w )0 to copy or delete the°dONLNdøwÉ*(ÄBentire data fork of the file during an installation, or delete the°dONLNdÉèø* (entire data fork during a removal.  Use °dONLNd*Éøè˚)±
  4473. noDataFork°dONLNd4É˚è)< to not°dONLNd<èõô(ò touch the data fork of the file.
  4474.     °dONLNd]•~∞ÿ(≠~Field Descriptions
  4475. °dONLNdp≥~ø*Total Target File Size°dONLNdá≥ø)ê?The size in bytes of the file to be installed or deleted.  This°dONLNd«øÀ* =field is only used by the Installer in figuring the disk size°dONLNdÀ◊≥* &needed for an installation.  (4-bytes)°dONLNd,fl~Î(Ë~Finder Attribute Flags°dONLNdC͈"+ê :These flags determine how Finder displays and manages user°dONLNd~ˆ-* Binteraction with the file.  If you are using ScriptCheck 4.0, then°dONLNd¡ˇ* 4this field is updated automatically (see ScriptCheck°dONLNdˆ+* >documentation for handling compressed source files), otherwise°dONLNd5&* 5you must place the correct value in this field.  See °dONLNdj& )‚Inside°dONLNdq&2p(/Macintoh, Volume VI°dONLNdÑ&p2)b(, pages 9-36 - 9-38 for more information°dONLNd≠2>ã(;about these flags.  (2-bytes)°dONLNdÀF~R(O~Source File Spec. Rsrc ID°dONLNdÂQ]+ê >The resource ID of a Source File Spec. (‘infs’) describing the°dONLNd$]i.* Esource file where the data is stored.  If you’re just deleting a file°dONLNdjiu* >and therefore don’t need a source file, enter 0 (zero) in this°dONLNd©uÅU* field.  (2-bytes)°dONLNdªâ~ï (í~Target Data Fork Piece Size°dONLNd◊î†+ê :The number of bytes the data fork piece will occupy in the°dONLNd    †¨* <target file.  If the data fork is decompressed using an Atom°dONLNd    O¨∏** ?Extender during the installation, then this value should be the°dONLNd    è∏ƒ* >original noncompressed size of the source piece.  The value is°dONLNd    Œƒ–-* @used to compute where multiple pieces are to be written into theˇzdˇ ˇˇˇˇd
  4476. d, Palatino
  4477. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4478.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú38
  4479. °dONLNdQ],(ZCfinal target file, and therefore must be exact.  If not copying the°dONLNdD]i»* ,data fork, this field is ignored.  (4-bytes),
  4480. Courier°dONLNdqq~} (z~Target Rsrc Fork Piece Size°dONLNdç|à!+ê >The number of bytes the resource fork piece will occupy in the°dONLNdÃàî    * =target file.  If not copying the resource fork, this field is°dONLNd
  4481. î†* <ignored.  If the resource fork is decompressed using an Atom°dONLNdG†¨** ?Extender during the installation, then this value should be the°dONLNdá¨∏* >original noncompressed size of the source piece.  The value is°dONLNdΔ∏ƒ-* @used to compute where multiple pieces are to be written into the°dONLNdƒ–* :final target file, and therefore must be exact.  (4-bytes)°dONLNdBÿ~‰¸(·~Source Version Number°dONLNdXÿ‰')ê=The version number (BCD format) of the source file when using°dONLNdñ‰ * the °dONLNdö‰ ò)useVersProcToCompare°dONLNdƉòΔ)x  flag.  See °dONLNd∫‰Δ).Inside Macintosh:°dONLNdÕ¸ì(˘Macintosh Toolbox Essentials°dONLNdÈì¸,)Ö$, page 7-31 for a description of the°dONLNd¸¢(!version number format.  (4-bytes)°dONLNd0~(~Version Compare Rsrc ID°dONLNdH)ê>The resource ID of a Version Compare (‘invc’) script resource.°dONLNdà(#* >The resulting version number from the version function will be°dONLNd«(4g* compared with the °dONLNdŸ(g4ª)YVersion Number°dONLNdÁ(ª4+)T field to determine if the°dONLNd4@#(=Btarget is newer or older than the source.  If the resource ID is 0°dONLNdE@LP* (zero) and the °dONLNdT@PL»)BuseVersProcToCompare°dONLNdh@»L)x flag is used the°dONLNdzLX¿(U(Installer will default to comparing the °dONLNd¢L¿X)≤Source Version°dONLNd±Xd2(aNumber°dONLNd∑X2d )$1 field with the version number in the ‘vers’ ID=1°dONLNdÈdp#(mBresource contained in the target file.  If no ‘vers’ ID=1 resource°dONLNd,p|$* @exists then the target version number is assumed to be 0 (zero).°dONLNdn|à7*     (2-bytes)°dONLNdxê~ú¸(ô~Atom Extender Rsrc ID°dONLNdéêú&)êAThe resource ID of an Atom Extender (‘inex’ script resource).  (2°dONLNdœê&ú*(ô&-°dONLNd–ú®*(•bytes)°dONLNd◊∞~º¸(π~File Atom Description°dONLNdÌ∞º)ê8The File Atom Description field is an even-padded Pascal°dONLNd&º»* ?string describing the atom.  This is used as part of the status°dONLNdf»‘* >dialog.  If you do not supply a description the Installer will°dONLNd•‘‡* ;display “Copying File: [file name]” or “Writing File: [file°dONLNd·‡Ï%* ?name].”  If you supply a description it will be appended to the°dONLNd!ϯù*  string “Copying “ or “Writing “.
  4482. °dONLNdB6$G(6 About the Resource Atom (‘inra’)"°∂ $4$0°∂°∂
  4483. °dONLNdc)~5$+HaThe Resource Atom should be used to copy or delete a single resources in a file.  Two versions of°dONLNd≈5~A-* athe Resource Atom script resource are understood by Installer 4.0, but it is recommended that you°dONLNd'A~M⁄* use format version 1.°dONLNd=U~a*VThe Resource Atom provides the following major features for copying or deleting files:,
  4484.  
  4485. Zapf Dingbats
  4486.     °dONLNdîk~tÖ*n
  4487. °dONLNdñiêu~)7Ability to update a resource only if it already exists.
  4488.     °dONLNdŒ~àÖ(Ü~n
  4489. °dONLNd–}êâC))Ability to preserve an existing resource.
  4490.     °dONLNd˙ì~úÖ(ö~n
  4491. °dONLNd¸ëêù)VAbility to preserve a newer resource based on its version number that is determined by°dONLNd    Sùê©Ù* custom code you write.
  4492.     °dONLNd    j≥~ºÖ(∫~n
  4493. °dONLNd    l±êΩq)2Decompression of the resource during installation.
  4494.     °dONLNd    ü«~–Ö(Œ~n
  4495. °dONLNd    °≈ê—)ZInstallation of a resource that has been split among multiple resources on multiple source°dONLNd    ¸—ê›´* disks.ˇŒdˇ ˇˇˇˇd
  4496. d, Palatino
  4497. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4498.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú39
  4499. °dONLNdQ~]$(Z~`If you must copy all the resources from a single source file and merge them with the target file°dONLNda]~if* 1you may want to consider using the ResMerge Atom.
  4500. °dONLNdìÅ6ï
  4501. (ê6Using the Resource Atom"°∂ ï4ï0°∂°∂
  4502. °dONLNd´¶~µ++H!Comparing Files By Version"°∂ ¥|¥0°∂°∂
  4503. °dONLNdΔπ~≈*[Two new fields in the Resource Atom allow the scriptwriter to compare the source and target°dONLNd"≈~—)* bresource based on the version number.  The first field holds the source file’s version number, and°dONLNdÖ—~›* Ythe second field holds the ID of a Version Compare (‘invc’) script resource.  The Version°dONLNdfl›~È* [Compare script resource allows the scriptwriter to call a code resource that calculates the°dONLNd;È~ı%* &version number of the target resource.°dONLNdb˝~    )*`To compare the version number of the target resource to the source version number entered in the°dONLNd√    ~* WResource Atom you’ll need to create and attach a Version Compare script resource to the°dONLNd~!
  4504. * XResource Atom.  Since setting and obtaining version number information for an individual°dONLNdt!~-(* `resource is not a feature of the Resource Manager, extracting the version number from the target°dONLNd’-~9* ]resource depends on how the resource encodes its version number.  Most examples of this use a°dONLNd39~E¬* Iheader at the beginning of the resource to hold this type of information.
  4505. °dONLNd}Y~h~*"'Using Split Sources with Resource Atoms"°∂ g|g0°∂°∂
  4506. °dONLNd•l~x)*dThe format 1 version of the Resource Atom script resource contains a list of source entries.  If the°dONLNd
  4507. x~Ñ!* boriginal resource must be split into smaller resource pieces, an entry for each split source piece°dONLNdmÑ~ê* _must be placed into the source list.  Each entry contains information about the location of the°dONLNdÕê~ú* asource file (‘infs’ ID), the source resource type, the source resource ID, the target size of the°dONLNd/ú~®* `resource piece, and the source resource name.  The target size field must contain the exact size°dONLNdê®~¥$* `the source piece will appear in the target resource.  If the piece is being decompressed with an°dONLNdÒ¥~¿-* `Atom Extender during installation, this field must contain the original uncompressed size of the°dONLNdR¿~Ãô* piece.°dONLNdZ‘~‡#*`When specifying more than one split resource piece, the Installer joins the pieces into a target°dONLNdª‡~Ï&* cresource in the order the sources are specified.  Generally, you’ll want to use ‘part’ for the type°dONLNdÏ~¯'* _of source resources that have been split and/or compressed.  This prevents resources compressed°dONLNd¯~* Yusing third-party schemes from being confused with the original resource, especially when°dONLNdŸ~ * $using  tools like ResEdit and DeRez.
  4508. °dONLNd˛$~3ê*"(Using Atom Extenders with Resource Atoms"°∂ 2|20°∂°∂
  4509. °dONLNd    '7~C&*]You’ll use an Atom Extender to decompress a resource that was compressed by you to save space°dONLNd    ÖC~O* Yon your source disks.  The Resource Atom is expanded into one or more parts that the Atom°dONLNd    flO~[˙* Extender receives with the ,
  4510. Courier°dONLNd    ˙O˙[<)| kBeforePart°dONLNd
  4511. O<[Q)B and °dONLNd
  4512.  
  4513. OQ[ç)
  4514. kAfterPart°dONLNd
  4515. Oç[#)<" messages.  There will be one part°dONLNd
  4516. 7[~g(d~^for each source resource piece specified in the source list.  Since owned resources are always°dONLNd
  4517. ñg~s.* ]copied whole and are usually relatively small, the owner’s Atom Extender is never called when°dONLNd
  4518. Ùs~˚* copying its owned resources.
  4519.     °dONLNd â~îö*NOTE
  4520. °dONLNd ó~£í*The °dONLNd óí£Œ)
  4521. compressed°dONLNd $óŒ£&)<O flag in the resource attributes should NOT be set on any source resource being°dONLNd t£~Ø(¨~Vdecompressed using an Atom Extender.  This flag is presently reserved for use by Apple°dONLNd ÀØ~ª¡* Computer, Inc. ,
  4522.  
  4523. Zapf Dingbats
  4524.     °dONLNd ⁄±¡∫»)Cuˇƒdˇ ˇˇˇˇd
  4525. d, Palatino
  4526. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4527.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú40
  4528. °dONLNdQ6e(`6Resource Atom Reference"°∂ e4e0°∂°∂
  4529. °dONLNdj~vÿ+HQThis section describes the resource description of the ‘inra’ resource, format 1.
  4530. °dONLNdjä6öΩ(ñ6Resource Description"°∂ ö4ö0°∂°∂,
  4531. Courier
  4532. °dONLNd¶~≤®+H#define°dONLNdá¶¥≤)6resourceAtomFlags°dONLNd¶¶
  4533. ≤(Ø
  4534. \°dONLNd™±¢ΩÃ(∫¢boolean°dONLNd≥±ÍΩÏ)H+dontDeleteWhenRemoving, deleteWhenRemoving;°dONLNd‡±
  4535. Ω(∫
  4536. \°dONLNd‰º¢»Ã(≈¢boolean°dONLNd̺ͻ)H/dontDeleteWhenInstalling, deleteWhenInstalling;°dONLNdº
  4537. »(≈
  4538. \°dONLNd!«¢”Ã(–¢boolean°dONLNd*«Í”D)HdontCopy, copy;°dONLNdD«
  4539. ”(–
  4540. \°dONLNdH“¢fiÍ(€¢ fill bit[6];°dONLNd\“zfiº)ÿ /* Reserved°dONLNdh“¬fiŒ)H*/°dONLNdn“
  4541. fi)H\°dONLNdr›¢ÈÃ(Ê¢boolean°dONLNd{›ÍÈå)HnoTgtRequired, tgtRequired;°dONLNdù›
  4542. È(Ê
  4543. \°dONLNd°Ë¢ÙÃ(Ò¢boolean°dONLNd™ËÍÙò)HupdateExisting, keepExisting;°dONLNdŒË
  4544. Ù(Ò
  4545. \°dONLNd“Û¢ˇÃ(¸¢boolean°dONLNd€Û͡™)H copyIfNewOrUpdate, copyIfUpdate;°dONLNdÛ
  4546. ˇ(¸
  4547. \°dONLNd˛¢
  4548. Ã(¢boolean°dONLNd˛Í
  4549. ‘)H'dontIgnoreProtection, ignoreProtection;°dONLNd8˛
  4550. 
  4551. (
  4552. \°dONLNd<    ¢Ã(¢boolean°dONLNdE    Íû)HsrcNeedExist, srcNeedNotExist;°dONLNdi    
  4553. (
  4554. \°dONLNdm¢ Ã(¢boolean°dONLNdvÍ 8)H
  4555. byName, byID;°dONLNdè
  4556.  (
  4557. \°dONLNdì¢+Ã((¢boolean°dONLNdúÍ+§)HnameNeedNotMatch, nameMustMatch°dONLNdæ5~AÃ(>~
  4558. type 'inra' {°dONLNdŒ@¢L“+$ switch {°dONLNd⁄K¥W+
  4559. case format1:°dONLNdÏVΔb&+ key integer = 1;°dONLNdVhb")¢/* Resource Atom Format vers */°dONLNd$aΔm2(jΔresourceAtomFlags;°dONLNd9ahm˛)¢/* Resource Atom Flags */°dONLNdWlΔx,(uΔunsigned longInt;°dONLNdllhx‡)¢/* Total Target Size°dONLNdÅlÊxÚ)~*/°dONLNdàÇΔé(ãΔ fileSpecID;°dONLNdôÇhéÏ)¢/* Target File Spec */°dONLNd¥çΔô¸(ñΔ    rsrcType;°dONLNd√çhô)¢/* Target Resource Type */°dONLNd‚òΔ§(°ΔrsrcID;°dONLNdòh§¯)¢/* Target Resource ID */°dONLNd
  4560. £Δ؈(¨Δinteger;°dONLNd£hØ()¢ /* Target Resource Attributes */°dONLNdAÆΔ∫,(∑ΔevenPaddedString;°dONLNdVÆh∫)¢/* Target Resource Name */°dONLNduƒΔ–n(ÕΔinteger = $$CountOf (Parts);°dONLNdíƒz–˛)¥/* Number of Pieces */°dONLNd≠œΔ€2(ÿΔwide array Parts {°dONLNd≈⁄ÿÊ+ fileSpecID;°dONLNd÷⁄zÊ")¢/* Source Piece File Spec */°dONLNd¯ÂÿÒ(Óÿ    rsrcType;°dONLNdÂzÒÚ)¢/* Source Piece Type°dONLNd¯Ò)~*/°dONLNd$ÿ¸(˘ÿrsrcID;°dONLNd2z¸)¢/* Source Piece Rsrc ID */°dONLNdR˚ÿ>(ÿunsigned longInt;°dONLNdg˚zÚ)¢/* Target Piece Size°dONLNd|˚¯)~*/°dONLNdÑÿ8(ÿevenPaddedString°dONLNdòz")¢/* Source Piece Rsrc Name */°dONLNdπΔÃ(Δ}°dONLNdø'Δ3,*unsigned longint;°dONLNd‘'h3
  4561. )¢/* Source Version Number */°dONLNdÙ2Δ>(;ΔrsrcID;°dONLNd2h>)¢/* Version Compare Rsrc ID */°dONLNd$=ΔI(FΔrsrcID;°dONLNd2=hI
  4562. )¢/* Atom Extender Rsrc ID */°dONLNdRHΔT,(QΔevenPaddedString;°dONLNdgHhTÏ)¢/* Atom Description */°dONLNdÄS¢_Æ(\¢};°dONLNdÉ^~jä(g~};
  4563.     °dONLNdÜz~Ö’*Flag Descriptions
  4564. °dONLNdòà~ît*)deleteWhenRemoving/dontDeleteWhenRemoving°dONLNd√ìü%+ê =Determines if the resource is deleted during a removal.  When°dONLNdü´9*
  4565. using the °dONLNd ü9´•)+deleteWhenRemoving°dONLNdü•´)l flag, if the target resource°dONLNd;´∑.(¥Bexists and the user clicks Remove, the target resource is deleted.°dONLNd∑√* ?If the resource does not exist on the target disk, this flag is°dONLNdø√œ* 7ignored.  Note that the Resource Atom must be part of a°dONLNd˜œ€s* package that uses the °dONLNd
  4566. œs€©)e    removable°dONLNdœ©€¡)6 flag.ˇZdˇ ˇˇˇˇd
  4567. d, Palatino
  4568. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4569.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú41,
  4570. Courier
  4571. °dONLNdQ~]å(Z~-deleteWhenInstalling/dontDeleteWhenInstalling°dONLNd.\h+ê <Determines if the resource is deleted during an installation°dONLNdkhtT* when using the °dONLNdzhTtÑ)FdontCopy°dONLNdÇhÑtÁ)0 flag.  When using the°dONLNdôtÄÜ(}deleteWhenInstalling°dONLNd≠tÜÄ)x% flag, after the user clicks Install,°dONLNd”Äå%(âBthe target resource is deleted if it exists, otherwise the flag is°dONLNdåòK* ignored.  The °dONLNd$åKò√)=deleteWhenInstalling°dONLNd8å√ò()x flag is primarily used°dONLNdPò§(°>for deleting previously installed resources that are no longer°dONLNdè§∞ö* needed.  Note that some flags (°dONLNdƧö∞)åleaveAloneIfNewer°dONLNdø§∞)f,°dONLNd¡∞ºV(π keepExisting°dONLNdÕ∞Vº)H+) can prevent deletion from happening under°dONLNd˘º»å(≈the circumstances specified.°dONLNd–~‹Ã(Ÿ~
  4572. copy/dontCopy°dONLNd&–‹ı)ê5Determines if the resource is copied or not during an°dONLNd\‹Ë±* %installation.  Note that some flags (°dONLNdÅ‹±Ë)£leaveAloneIfNewer°dONLNdí‹Ë)f,°dONLNdîËÙV(Ò keepExisting°dONLNd†ËVÙ[)H, °dONLNd¢Ë[Ù£) copyIfUpdate°dONLNdÆË£Ù)H) can prevent copying from°dONLNd…Ù⁄(˝,happening under the circumstances specified.°dONLNd¯~P(~#leaveAloneIfNewer/updateEvenIfNewer°dONLNd)+ê >Determines what action the Installer should take if the target°dONLNd[+!* @resource is newer than the source resource that is replacing it.°dONLNdù+7,* ?The scriptwriter must write a code resource that determines the°dONLNd›7C* :version number by referencing the resource ID of a Version°dONLNdCO»* +Compare (‘invc’) script resource.  Use the °dONLNdCC»O.)∫leaveAloneIfNewer°dONLNdUO[(X<flag to prevent the older source resource from replacing the°dONLNdí[g * >newer target resource during an installation.  Unlike the File°dONLNd—gs* >Atom, the user is not given a chance to override the result of°dONLNdsb* this flag.  Use the °dONLNd$sb»)TupdateEvenIfNewer°dONLNd5s»')f flag if the version of°dONLNdMã(à<this resource must be synchronized with specific versions of°dONLNdäãó
  4573. * ;other files or resources that are part of the installation.°dONLNdΔü~´(®~tgtRequired/noTgtRequired°dONLNd‡™∂+ê =The target file for this resource must already exist.  If the°dONLNd∂¬,* Dtarget file does not exist, the user is warned that a target file is°dONLNdc¬Œ$* =needed.  (For example, AppleShare installs resources into the°dONLNd°Œ⁄ * ASystem file, but if there is no system file, the Installer alerts°dONLNd„⁄Ê-* ?the user, rather than creating a System file which has only the°dONLNd#ÊÚ⁄* -AppleShare resources in it.)  When using the °dONLNdPÊ⁄Ú()Ã
  4574. noTgtRequired°dONLNd^Ú˛((˚Bflag and the target file does not exist, the Installer will create°dONLNd°˛
  4575.  * one.°dONLNd¶~ (~keepExisting/updateExisting°dONLNd¬)"+ê =Allows the scriptwriter to preserve an existing resource when°dONLNd)59*
  4576. using the °dONLNd
  4577. )95Q)+copy°dONLNd)Q5t) and/or °dONLNd)t5Œ)#deleteOnInstall°dONLNd%)Œ5))Z flag.  This might be°dONLNd;5A(>;the case if you want to preserve a preference resource that°dONLNdwAMû* "contains user specific data.  Use °dONLNdôAûMÊ)ê keepExisting°dONLNd•AÊM()H to prevent the°dONLNdµMY.(VBInstaller from disturbing an existing target resource.  No copying°dONLNd¯YeX* will occur if the °dONLNd    
  4578. YXe¨)JupdateExisting°dONLNd    Y¨e )T flag is used with the°dONLNd    /eqV(n copyIfUpdate°dONLNd    ;eVqn)H flag.°dONLNd    By~Ö2(Ç~copyIfUpdate/copyIfNewOrUpdate°dONLNd    aÑê&+ê ?Allows the scriptwriter to update a resource only if it already°dONLNd    °êúT* exists.  Use the °dONLNd    ≤êTúú)F copyIfUpdate°dONLNd    æêúú#)H flag to prevent a new resource°dONLNd    fiú®Ñ(•from being created.  If the °dONLNd    ˙úÑ®Ã)v copyIfUpdate°dONLNd
  4579. úî,)H flag is used with the°dONLNd
  4580. ®¥V(± keepExisting°dONLNd
  4581. )®V¥‰)H! flag then no copying will occur.°dONLNd
  4582. Kº~»\(≈~%ignoreProtection/dontIgnoreProtection°dONLNd
  4583. q«”-+ê ADetermines if the user should be alerted if any resource with its°dONLNd
  4584. ≥”fl!* >protected bit set will be replaced or deleted.  When using theˇ‘dˇ ˇˇˇˇd
  4585. d, Palatino
  4586. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4587.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú42,
  4588. Courier
  4589. °dONLNdQ]n(ZignoreProtection°dONLNdQn] )`% flag the resource is deleted from or°dONLNd6]i(f@updated in the target file even if it is protected in the target°dONLNdwiu"* file.°dONLNd}}~â&(Ü~srcNeedExist/srcNeedNotExist°dONLNdöàî+ê 9Determines whether the source resources must exist on the°dONLNd‘î†k* source disk.  Use the °dONLNdÍîk†≈)]srcNeedNotExist°dONLNd˘î≈†)Z flag if the source°dONLNd
  4590. †¨'(©Bresources can optionally reside on the source disk.  If the source°dONLNdP¨∏&* Bfile or source resources are not found, the atom it is ignored and°dONLNdì∏ƒ±* $the installation continues normally.°dONLNdπÃ~ÿ¿(’~ byID/byName°dONLNd≈Ãÿ%)ê=Determines how the resource should be found in the source and°dONLNdÿ‰{* target files. If using the °dONLNdÿ{‰ì)mbyID°dONLNd"ÿì‰")" flag the resource is found in the°dONLNdE‰#(ÌAsource and target file using only the ID.  If you want to require°dONLNdá¸‰* /the resource name to match as well then use the°dONLNd∑¸\*
  4591. nameMustMatch°dONLNdƒ¸\≠)N flag.  If using the °dONLNdŸ¸≠—)QbyName°dONLNdfl¸—()$ flag the resource is°dONLNdı,(Afound in the source and target file using only the name specified°dONLNd7 +* in the °dONLNd>+ [)Resource°dONLNdF[ ])0 °dONLNdG] u)Name°dONLNdKu ∫) field.  Use the °dONLNd\∫ fi)EbyName°dONLNdbfi )$
  4592.  flag when°dONLNdm ,()<installing Desk Accessory resources in pre-7.0 System files.°dONLNd™4~@2(=~nameMustMatch/nameNeedNotMatch°dONLNd…?K$+ê ASpecifies that the resource found in the source file using its ID°dONLNd KW'* <have the name in the Resource Name field.  The resource with°dONLNdHWc* 8the same name and ID in the target file, if any, will be°dONLNdÅcoà* replaced or deleted (if the °dONLNdùcào‹)zupdateExisting°dONLNd´c‹o)T flag is used).°dONLNdºo{Ñ(xThis flag is ignored if the °dONLNdÿoÑ{®)vbyName°dONLNdfio®{()$  flag, above, is used.  If using°dONLNdˇ{á (Ñthe °dONLNd{ áÄ)nameNeedNotMatch°dONLNd{Äá©)`
  4593.  flag the °dONLNd{©á¡))byID°dONLNd!{¡á') flag must also be used.
  4594.     °dONLNd:ë~úÿ(ô~Field Descriptions
  4595. °dONLNdMü~´‰*Total Target Size°dONLNd_ü´*)êAThe size in bytes of the copied target resource and all its owned°dONLNd°´∑-* Dresources.  This field is used only by the Installer in figuring the°dONLNdÊ∑√›* 0disk size needed for an installation.  (4-bytes)°dONLNdÀ~◊(‘~Target Resource File Spec.°dONLNd3÷‚ +ê AThe resource ID of a Target File Spec script resource (‘intf’, or°dONLNdu‚Ó!* B‘infs’ for pre-4,0 scripts) describing the file on the target disk°dONLNd∏Ó˙* <where the resource will be deleted, created, or updated.  (2°dONLNdÙÓ˙(˜-°dONLNdı˙*(bytes)°dONLNd˝~ˆ(~Target Resource Type°dONLNd)ê>The resource type the Installer will use to find or create the°dONLNdQ&∞* 'resource in the target file.  (4-bytes)°dONLNdz.~:Í(7~Target Resource ID°dONLNdç.:)ê<The resource ID the Installer will use to find or create the°dONLNd :F* ?resource in the target file.  If the ID of the resource doesn’t°dONLNd
  4596. FR∞* $matter and you’re copying using the °dONLNd.F∞R‘)¢byName°dONLNd4F‘R)$ flag (e.g., most°dONLNdFR^([<Desk Accessories), this field should be 0, in which case the°dONLNdÉ^j* >Installer picks an ID for the resource in the target file.  (2°dONLNd¡^j(g-°dONLNd¬jv*(sbytes)°dONLNd ~~ä(á~Target Resource Attributes°dONLNdÂâï+ê =The attributes that will be given to the target resource when°dONLNd    #ï°a* copying.  (2-bytes)°dONLNd    8©~µˆ(≤~Target Resource Name°dONLNd    M©µ)ê<The name that will be given to the target resource.  If this°dONLNd    äµ¡* >string is empty, the name of the first source resource will be°dONLNd    …¡Õ* :given to the target resource.  (even-padded Pascal string)ˇ¬dˇ ˇˇˇˇd
  4597. d, Palatino
  4598. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4599.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú43,
  4600. Courier
  4601. °dONLNdQ~](Z~Source Piece File Spec.°dONLNdQ])ê>The resource ID of a Source File Spec. (‘infs’) describing the°dONLNdW]i+* Dsource file that holds the resource part.  If you’re just deleting a°dONLNdúiu(* Aresource and therefore don’t need a source file, leave the source°dONLNdfiuÅm* list empty.  (2-bytes)°dONLNdıâ~ï‰(í~Source Piece Type°dONLNdâï()êBThe resource type of the resource piece being copied.  If there is°dONLNdJï°%* >more then one piece, it’s recommended that the type by ‘part’.°dONLNdä°≠7*     (4-bytes)°dONLNdïµ~¡ÿ(æ~Source Piece ID°dONLNd•µ¡*)êBThe resource ID of the resource piece being copied.  This field is°dONLNdˡկ* 6ignored if the resource piece is being found by name (°dONLNd¡¯Õ)ÍbyName°dONLNd%ÕŸu(÷flag is used).  (2-bytes)°dONLNd@·~̉(Í~Target Piece Size°dONLNdR·Ì*)ê@The number of bytes the resource piece will occupy in the target°dONLNdìÌ˘    * 9file.  If the resource will be decompressed using an Atom°dONLNdÕ˘#* =Extender, then this value should be the noncompressed size of°dONLNd (* ?the source piece.  This value is used to compute where multiple°dONLNdK * @pieces are to be written in the final target file, and therefore°dONLNdå)y* must be exact.  (4-bytes)°dONLNdß1~=(:~Source Piece Resource Name°dONLNd¬<H,+ê @The name of the source resource.  This field is only needed when°dONLNdHTÂ* 2finding the source resource by its resource name (°dONLNd5HÂT    )◊byName°dONLNd;H    T()$ flag is°dONLNdDT`≠(]#used).  (even-padded Pascal string)°dONLNdhh~t¸(q~Source Version Number°dONLNd~ht))ê=The version number (BCD format) of the source resource when a°dONLNdºtÄ,* @Version Compare function is used to calculate the target version°dONLNd˝Äå^* number.  (4-bytes)°dONLNdî~†(ù~Version Compare Rsrc ID°dONLNd(î†)ê>The resource ID of a Version Compare (‘invc’) script resource.°dONLNdh†¨#* >The resulting version number from the version function will be°dONLNdߨ∏g* compared with the °dONLNdπ¨g∏Â)YSource Version Number°dONLNdŒ¨Â∏    )~     field to°dONLNdÿ∏ƒ-(¡Cdetermine if the target is newer or older than the source.  If this°dONLNdƒ–(* Afield is 0 (zero) then the target version number is assumed to be°dONLNd^–‹`* 0 (zero).  (2-bytes)°dONLNds‰~¸(Ì~Atom Extender Rsrc ID°dONLNdâ‰)ê=The resource ID of an Atom Extender (‘inex’) script resource.°dONLNd»¸* 8This Atom Extender will be called during copying of each°dONLNd¸x* resource part.  (2-bytes)°dONLNd*8When using InstaCompOne compression enter a value of 241°dONLNdU(&* here.°dONLNd[0~<(9~Resource Atom Description°dONLNdwCO"+êThe °dONLNd{C"OX)    Resource °dONLNdÑCXO)6(Atom Description field is an even-padded°dONLNd≠O[(X?Pascal string describing the atom.  This is used as part of the°dONLNdÌ[g!* @status dialog.  If you do not supply a description the Installer°dONLNd.gs,* Awill display “Building File: [file name]” or “Writing File: [file°dONLNdps%* ?name].”  If you supply a description it will be appended to the°dONLNd∞ãü* !string “Building “ or “Writing “.ˇûdˇ ˇˇˇˇd
  4602. d, Palatino
  4603. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4604.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú44
  4605. °dONLNdQ6ej(`6%About the Resource List Atom (‘inr#’)"°∂ e4e0°∂°∂
  4606. °dONLNd&j~v+H[The Resource List Atom is a unique atom that provides a more compact storage structure with°dONLNdÇv~Ç* \slightly reduced functionality for installing resources.  This enables scriptwriters to copy°dONLNdflÇ~é* Tthousands of individual resources without the overhead of thousands of Resource Atom°dONLNd4é~ö* bresources in their script file.  For installation of less than a 100 resources, most scriptwriters°dONLNdóö~¶\* 0should continue using individual Resource Atoms.
  4607. °dONLNd»æ6“,(Õ6Using the Resource List Atom"°∂ “4“0°∂°∂
  4608. °dONLNdÂ◊~„$+H]The Resource List Atom is actually an array of individual Resource Atom records.  The records°dONLNdC„~Ô,* aare of a fixed size, so some options available in format 1 of the Resource Atom are not available°dONLNd•Ô~˚Ù* in the Resource List Atom.°dONLNd¡~'*]Use format1 Resource Atoms instead of the Resource List Atom if you need any of the following°dONLNd~¶*     features:,
  4609.  
  4610. Zapf Dingbats
  4611.     °dONLNd*%~.Ö*n
  4612. °dONLNd,#ê/C))Find a source resource based on its name.
  4613.     °dONLNdV9~BÖ(@~n
  4614. °dONLNdX7êCp)4Copy a resource that is split across multiple files.
  4615.     °dONLNdçM~VÖ(T~n
  4616. °dONLNdèKêW)Specify a target resource name.
  4617.     °dONLNd∞a~jÖ(h~n
  4618. °dONLNd≤_êkä)2Use with InstaCompOne decompression Atom Extender.
  4619.     °dONLNdÊu~~Ö(|~n
  4620. °dONLNdËsê)VChange the type or ID during installation.  The Resource List Atom requires the target°dONLNd?êã * Gresource type and ID to be the same as the source resource type and ID.
  4621. °dONLNdáü~Æ∞(™~-Referencing Resource Atom Lists from Packages"°∂ ≠|≠0°∂°∂
  4622. °dONLNdµ≤~æ$*^Unlike other atoms, Resource Atom Lists are not referenced using their own atom type (‘inr#’).°dONLNdæ~ #* ]Instead, packages should reference the atom type ‘inra’ and the ID entered in the Resource ID°dONLNds ~÷#* _field of the resource atom record inside the Resource Atom List array.  When an ‘inra’ is found°dONLNd”÷~‚* `referenced from a package, the Installer first looks for a Resource List Atom (‘inr#’) resource,°dONLNd4‚~Ó* aand if not found looks for an actual resource of type ‘inra’ and the specified ID in script file.°dONLNdóÓ~˙&* ^When the Resource List Atom resource is found, the Installer searches through the list looking°dONLNdˆ˙~§* Cfor a resource record that matches the requested resource ID.  The ,
  4623. Courier°dONLNd9˙§Ê(§ Resource ID°dONLNdD˙Ê)B
  4624.  field in the°dONLNdR~C(~,record holds a 2-byte value that you create.
  4625. °dONLNd*6>2(96Resource List Atom Reference"°∂ >4>0°∂°∂
  4626. °dONLNdúC~Oÿ+HQThis section describes the resource description of the ‘inr#’ resource, format 0.
  4627. °dONLNdÓc6sΩ(o6Resource Description"°∂ s4s0°∂°∂
  4628. °dONLNd~ãÃ+H
  4629. type 'inr#' {°dONLNdä¢ñ“+$ switch {°dONLNd殺+
  4630. case format0:°dONLNd1†Δ¨&+ key integer = 0;°dONLNdC†D¨)~"/* Resource Atom Format version */°dONLNdj∂Δ¬Ü(øΔ integer = $$CountOf (inraRsrcs);°dONLNdã∂å¬")Δ/* Number of inraRsrcs */°dONLNd©¡ΔÕJ( Δwide array inraRsrcs {°dONLNd≈Ãÿÿ+ integer;°dONLNd‘ÃzÿŒ)¢/* Resource ID°dONLNd„Ñÿ‡)Z*/°dONLNdÎ◊ÿ„n(‡ÿresourceAtomFlagsFormat1;°dONLNd    ◊z„)¢/* Resource Atom Flags */ˇÜdˇ ˇˇˇˇd
  4631. d, Palatino
  4632. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4633.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú45,
  4634. Courier
  4635. °dONLNdQÿ]>(Zÿunsigned longInt;°dONLNdQz]Ú)¢/* Total Target Size°dONLNd*Q¯])~*/°dONLNd2\ÿh(eÿ fileSpecID;°dONLNdC\zh˛)¢/* Target File Spec */°dONLNd_gÿs(pÿ fileSpecID;°dONLNdpgzs˛)¢/* Source File Spec */°dONLNdårÿ~({ÿ    rsrcType;°dONLNdõrz~)¢/* Src/Tgt Rsrc Type */°dONLNd∏}ÿâ(ÜÿrsrcID;°dONLNdΔ}zâ¯)¢/* Src/Tgt Rsrc ID */°dONLNd·àÿî(ëÿinteger;°dONLNdàzî)¢/* Tgt Rsrc Attributes */°dONLNdìÿü>(úÿunsigned longint;°dONLNd$ìzü)¢/* Source Version Number */°dONLNdEûÿ™(ßÿrsrcID;°dONLNdSûz™()¢/* Version Compare Rsrc ID */°dONLNdv©ÿµ(≤ÿrsrcID;°dONLNdÑ©zµ˛)¢/* Atom Extender ID */°dONLNd†¥ÿ¿>(Ωÿunsigned longInt;°dONLNdµ¥z¿)¢/* Target Size of Rsrc */°dONLNd”øΔÀ“(»Δ};°dONLNdÿ ¢÷Æ(”¢};°dONLNd€’~·ä(fi~};
  4636.     °dONLNdfiÒ~¸’*Flag Descriptions
  4637. °dONLNdˇ~ -*aThe flags for the Resource List Atom are identical to format 1 of the Resource Atom.  Since there°dONLNdR ~“* Lis no source name field in the Resource List Atom you should always use the °dONLNdû “Í(“byID°dONLNd¢ Í˝) and°dONLNdß~#fi( ~nameNeedNotMatch°dONLNd∑fi#˙)` flags.
  4638.     °dONLNd¿-~8ÿ(5~Field Descriptions
  4639. °dONLNd”;~G¿* Resource ID°dONLNdfl;G)ê;The ID value that will be used to find this record from the°dONLNdGS,* @reference in a package.  For example, if you choose the ID value°dONLNd\S_** >of 369, then the reference from a package should have the type°dONLNdõ_kõ* !‘inra’ and the ID 369.  (4-bytes)°dONLNdæs~‰(|~Total Target Size°dONLNd–s)ê=The size, in bytes, of the copied target resource and all its°dONLNdã* >owned resources.  This field is only used by the Installer for°dONLNdMãó$* @calculating the disk size needed for an installation.  (4-bytes)°dONLNdèü~´‰(®~Target File Spec.°dONLNd°ü´ )êAThe resource ID of a Target File Spec script resource (‘intf’, or°dONLNd„´∑!* B‘infs’ for pre-4,0 scripts) describing the file on the target disk°dONLNd&∑√* <where the resource will be deleted, created, or updated.  (2°dONLNdb∑√(¿-°dONLNdc√œ*(Ãbytes)°dONLNdk◊~„‰(‡~Source File Spec.°dONLNd}◊„)ê>The resource ID of a Source File Spec. (‘infs’) describing the°dONLNdº„Ô** Dsource file that holds the source resource.  If you’re just deleting°dONLNdÔ˚,* Ca resource and therefore don’t need a source file, place a 0 (zero)°dONLNdE˚u* in this field.  (2-bytes)°dONLNd_~¸(~Src/Tgt Resource Type°dONLNdu")ê@The resource type the Installer will use to find the resource in°dONLNd∂'** Cthe target and source file.  If the resource must be created in the°dONLNd˙'3‡* 2target file it will be given this type.  (4-bytes)°dONLNd.;~G(D~Src/Tgt Resource ID°dONLNdB;G+)êBThe resource ID the Installer will use to find the resource in the°dONLNdÖGS* ?target and source file.  If the resource must be created in the°dONLNd≈S_◊* 0target file it will be given this ID.  (2-bytes)°dONLNd˜g~s(p~Target Resource Attributes°dONLNdr~+ê =The attributes that will be given to the target resource when°dONLNdP~äa* copying.  (2-bytes)°dONLNdeí~û¸(õ~Source Version Number°dONLNd{íû))ê=The version number (BCD format) of the source resource when a°dONLNdπû™,* @Version Compare function is used to calculate the target version°dONLNd˙™∂^* number.  (4-bytes)°dONLNd    
  4640. æ~ («~Version Compare Rsrc ID°dONLNd    %æ )ê>The resource ID of a Version Compare (‘invc’) script resource.°dONLNd    e ÷.* >The resulting version number from the Version Compare function°dONLNd    §÷‚â* will be compared with the °dONLNd    æ÷â‚){Source Version Number°dONLNd    ”÷‚+)~     field toˇdˇ ˇˇˇˇd
  4641. d, Palatino
  4642. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4643.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú46
  4644. °dONLNdQ]-(ZCdetermine if the target is newer or older than the source.  If this°dONLNdD]i(* Afield is 0 (zero) then the target version number is assumed to be°dONLNdÜiu`* 0 (zero).  (2-bytes),
  4645. Courier°dONLNdõ}~â¸(Ü~Atom Extender Rsrc ID°dONLNd±}â)ê=The resource ID of an Atom Extender (‘inex’) script resource.°dONLNdâï* 8This Atom Extender will be called during copying of each°dONLNd)ï°b* resource.  (2-bytes)°dONLNd>©~µ¿(≤~ Target Size°dONLNdJ©µ&)êAThe size in bytes of the copied target resource item.  This field°dONLNd嵡)* Bis used only by the Installer in figuring the disk size needed for°dONLNdœ¡ÕÇ* an installation.  (4-bytes)
  4646. °dONLNdÏ˘6
  4647. (6About the Font Atom (‘inff’)"°∂ 
  4648. 4
  4649. 0°∂°∂
  4650. °dONLNd    ~#+HaThe Font Atom is used to describe a set of font strikes (size/style) from a specified font family°dONLNdk~** [which should be copied to or removed from a file.  Two versions of the Resource Atom script°dONLNd«*~6* ^resource are understood by Installer 4.0, but it is recommended that you use format version 1.°dONLNd&>~JÔ*RThe Font Atom provides the following major features for copying or deleting fonts:,
  4651.  
  4652. Zapf Dingbats
  4653.     °dONLNdyT~]Ö*n
  4654. °dONLNd{Rê^N),Ability to preserve an existing font strike.
  4655.     °dONLNd®h~qÖ(o~n
  4656. °dONLNd™fêr)UAbility to specify an individual strike to copy/delete or simple mode that copies the°dONLNdrê~fi* complete family.
  4657.     °dONLNdà~ëÖ(è~n
  4658. °dONLNdÜêí    )TSupport for installing into all versions of System Software with a single Font Atom.
  4659.     °dONLNdhú~•Ö(£~n
  4660. °dONLNdjöê¶Ò)ODecompression of font resources (‘NFNT’, ‘sfnt’ or ‘FONT’) during installation.
  4661.     °dONLNd∫∞~πÖ(∑~n
  4662. °dONLNdºÆê∫))]Installation of a font strike that has been split among multiple resources on multiple source°dONLNd∫êΔ´* disks.
  4663. °dONLNd!fi6Ú‚(Ì6Using the Font Atom"°∂ Ú4Ú0°∂°∂
  4664. °dONLNd5~e+H!"Auto-Routing Under Pre-7.1 Systems"°∂ |0°∂°∂
  4665. °dONLNdX~"
  4666. *YTo overcome the effort involved with installing fonts into the various versions of System°dONLNd≤"~.* [Software, the Installer will automatically place the font resources into the System file if°dONLNd.~:* _installing into a System Folder that does not support the “Fonts” folder.  To use this feature,°dONLNdn:~F$* `write your script to always install into a file in the System Folder’s “Fonts” folder.  Make the°dONLNdœF~R* ]target file path start with the reserved folder name “special-font” and reference this target°dONLNd-R~^¥* Ffile spec. from the Font Atom, and the Installer will handle the rest.
  4667.     °dONLNdth~sö*NOTE
  4668. °dONLNdyv~Ç+*\System Software installation scriptwriters should understand how the Installer decides where°dONLNd÷Ç~é-* ethe font resources will be installed to avert disasters, and bugs.  The Installer uses the version of°dONLNd<é~ö* ]the target System file and the existence of a Resource Atom installing the ‘fld#’ resource to°dONLNdöö~¶* ]decide whether to auto-route or not.  You must be installing a ‘fld#’ resource into a pre-7.1°dONLNd¯¶~≤'* _System file at the same time as the fonts to let the Installer know you are upgrading to System°dONLNd    X≤~æ∏* 7.1 or newer. 
  4669.     °dONLNd    f¥∏Ωø):uˇ»dˇ ˇˇˇˇd
  4670. d, Palatino
  4671. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4672.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú47
  4673. °dONLNdQ~`p(\~$Using Atom Extenders with Font Atoms"°∂ _|_0°∂°∂
  4674. °dONLNd%d~p*\You’ll use an Atom Extender to decompress font resources that were compressed by you to save°dONLNdÇp~|#* ^space on your source disks.  Minor constraints are required when using the Font Atom with this°dONLNd·|~à¢* feature.°dONLNdÍê~ú*XScriptwriters must specify individual strikes(size and style) to copy when using an Atom°dONLNdCú~®* `Extender to decompress font resources.  This is required because the target piece sizes for each°dONLNd§®~¥* ^strike must be entered in the optional source list.  It’s recommended to place compressed font°dONLNd¥~¿9* ,resource data into resources of type ‘part’.°dONLNd2»~‘*YThe Font Atom is expanded into one or more parts that the Atom Extender receives with the,
  4675. Courier°dONLNdå‘~‡¿* kBeforePart°dONLNd󑿇’)B and °dONLNdú‘’‡)
  4676. kAfterPart°dONLNd¶‘‡
  4677. )<8 messages.  As each part is installed, the Atom Extender°dONLNdfl‡~Ï$(È~_attached to the original Font Atom will be called for each part.  There will be a part for each°dONLNd?Ï~¯* bsource resource piece being copied.  The only exception to this rule is for strikes that reference°dONLNd¢¯~#* `font resources in ROM.  Since there is no data copied for these strikes the Atom Extender is not°dONLNd~û* called.
  4678.     °dONLNd ~%ö*NOTE
  4679. °dONLNd(~4*XThe ‘FOND’ resource is always copied using the Installer’s default copy mechanism.  This°dONLNdi4~@-* ]prevents the scriptwriter from decompressing the ‘FOND’ resource using an Atom Extender.  The°dONLNd«@~L* X‘FOND’ resource is the road map to other font resources (‘FONT, ‘NFNT’, and ‘sfnt’), and°dONLNd L~X&* ]therefore must never be compressed.  We suggest that you convert the ‘FOND’ resource into the°dONLNd~X~dÌ* type ‘iFND’ and use the °dONLNdñXÌdG)oencodedFONDRsrc°dONLNd•XGd))Z4  flag when compressing any of the font resources it°dONLNd⁄d~p(m~Xreferences.  This will prevent the system software from becoming confused when finding a°dONLNd3p~|#* a‘FOND’ resource in your source file that may reference not existent font resources.  In addition,°dONLNdï|~àê* the °dONLNdô|êàÃ)
  4680. compressed°dONLNd£|Ãà+)<Q flag should NOT be set in the resource attributes of the ‘part’ resource because°dONLNdıà~îñ(ë~@this flag is presently reserved for use by Apple Computer, Inc. ,
  4681.  
  4682. Zapf Dingbats
  4683.     °dONLNd5äñìù(ëñu
  4684. °dONLNd7¨6¿Ë(ª6Font Atom Reference"°∂ ¿4¿0°∂°∂
  4685. °dONLNdK≈~—Ú+HXThis section describes the resource description of the ‘inff’ script resource, format 1.
  4686. °dONLNd§Â6ıΩ(Ò6Resource Description"°∂ ı4ı0°∂°∂
  4687. °dONLNdπ~
  4688. ®+H#define°dONLNd¡¥
  4689. “)6Style°dONLNdÿ
  4690. 
  4691. (
  4692. 
  4693. \°dONLNd€ êÿ(ê fill bit[9];°dONLNdÚ ûÚ(û/* Reserved */°dONLNd 
  4694. )l\°dONLNdê#∫( êBoolean°dONLNd
  4695. Δ#Ä)6noExtendedStyle, extendedStyle;°dONLNd-å#
  4696. )Δ/* Extended style */\°dONLNdD"ê.∫(+êBoolean°dONLNdL"Δ.)67noCondensedStyle, condensedStyle;/* Condensed style */\°dONLNdÖ-ê9∫(6êBoolean°dONLNdç-Δ9 )6noShadowStyle, °dONLNdù-29z)l shadowStyle;°dONLNd™-å9¯)Z/* Shadow style */°dONLNdΩ-
  4697. 9)~\°dONLNd¿8êD∫(AêBoolean°dONLNd»8ΔDt)6noOutlineStyle, outlineStyle;°dONLNdÁ8åD˛)Δ/* Outline style */°dONLNd˚8
  4698. D)~\°dONLNd˛CêO∫(LêBoolean°dONLNd    CΔO)67noUnderlineStyle, underlineStyle;/* Underline style */\°dONLNd    ?NêZ∫(WêBoolean°dONLNd    GNΔZh)6noItalicStyle, italicStyle;°dONLNd    dNåZ¯)Δ/* Italic style */°dONLNd    wN
  4699. Z)~\°dONLNd    zYêe∫(bêBoolean°dONLNd    ÇYΔeP)6noBoldStyle, boldStyle;°dONLNd    ùYåeÏ)Δ/* Bold style */°dONLNd    Æo~{ (x~#define fontFamilyAtomFlags°dONLNd    ÷o
  4700. {(x
  4701. \°dONLNd    ⁄z¢ÜÃ(É¢boolean°dONLNd    „zÍÜÏ)H+dontDeleteWhenRemoving, deleteWhenRemoving;°dONLNd
  4702. z
  4703. Ü(É
  4704. \°dONLNd
  4705. Ö¢ëÃ(é¢boolean°dONLNd
  4706. ÖÍë)H/dontDeleteWhenInstalling, deleteWhenInstalling;°dONLNd
  4707. MÖ
  4708. ë(é
  4709. \°dONLNd
  4710. Qê¢úÃ(ô¢boolean°dONLNd
  4711. ZêÍúD)HdontCopy, copy;°dONLNd
  4712. tê
  4713. ú(ô
  4714. \°dONLNd
  4715. xõ¢߉(§¢ fill bit[5]°dONLNd
  4716. çõå߇)Í/* Reserved */°dONLNd
  4717. ûõ
  4718. ß)~\°dONLNd
  4719. ¢¶¢≤Ã(Ø¢boolean°dONLNd
  4720. ´¶Í≤º)H#noEncodedFONDRsrc, encodedFONDRsrc;°dONLNd
  4721. ”¶
  4722. ≤(Ø
  4723. \°dONLNd
  4724. ◊±¢ΩÃ(∫¢boolean°dONLNd
  4725. ‡±ÍΩå)HnoTgtRequired, tgtRequired;°dONLNd ±
  4726. Ω(∫
  4727. \°dONLNd º¢»Ã(≈¢boolean°dONLNd ºÍ»ò)HupdateExisting, keepExisting;°dONLNd 3º
  4728. »(≈
  4729. \°dONLNd 7«¢”Ã(–¢boolean°dONLNd @«Í”™)H copyIfNewOrUpdate, copyIfUpdate;°dONLNd f«
  4730. ”(–
  4731. \°dONLNd j“¢fiÃ(€¢boolean°dONLNd s“Ífi‘)H'dontIgnoreProtection, ignoreProtection;°dONLNd ù“
  4732. fi(€
  4733. \ˇdˇ ˇˇˇˇd
  4734. d, Palatino
  4735. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4736.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú48,
  4737. Courier
  4738. °dONLNdQ¢]Ã(Z¢boolean°dONLNd    QÍ]û)HsrcNeedExist, srcNeedNotExist;°dONLNd-Q
  4739. ](Z
  4740. \°dONLNd1\¢hÃ(e¢boolean°dONLNd:\Íh8)H
  4741. byName, byID;°dONLNdS\
  4742. h(e
  4743. \°dONLNdWg¢sÃ(p¢boolean°dONLNd`gÍs§)HnameNeedNotMatch, nameMustMatch°dONLNdÄ}~â®(Ü~#define°dONLNdà}¥â‰)6RsrcSpec°dONLNd°}
  4744. â(Ü
  4745. \°dONLNd•à¢î‰(ë¢ fileSpecID;°dONLNdµà2î‡)ê/* Source Piece File Spec. */°dONLNd’à
  4746. î)ÿ\°dONLNdŸì¢üÿ(ú¢    rsrcType;°dONLNdÁì2ü»)ê/* Source Piece Rsrc Type°dONLNdì‘ü‡)¢*/°dONLNdì
  4747. ü)6\°dONLNd
  4748. û¢™Ã(ߢrsrcID;°dONLNdû2™Œ)ê/* Source Piece Rsrc ID */°dONLNd5û
  4749. ™)ÿ\°dONLNd9©¢µ(≤¢unsigned longInt;°dONLNdM©2µ⁄)ê/* Source Piece Rsrc Size */°dONLNdl©
  4750. µ)ÿ\°dONLNdp¥¢¿(Ω¢evenPaddedString°dONLNdÉ¥2¿⁄)ê/* Source Piece Rsrc Name */°dONLNd§ ~÷®(”~#define°dONLNd¨ ¥÷¸)6 SrcPartsList°dONLNd« 
  4751. ÷(”
  4752. \°dONLNdÀ’¢·˛(fi¢:integer = $$CountOf (Pieces);/* Number of source pieces */°dONLNd’
  4753. ·(fi
  4754. \°dONLNd
  4755. ‡¢Ï(È¢wide array Pieces{°dONLNd*‡
  4756. Ï(È
  4757. \°dONLNd/Î¥˜Í(Ù¥    RsrcSpec;°dONLNd=ÎD˜¯)ê/* Description of this piece*/°dONLNd\Î
  4758. ˜)Δ\°dONLNd`ˆ¢®(ˇ¢}°dONLNdb ~“(~#define Strike°dONLNdÇ 
  4759. (
  4760. \°dONLNdÖê#¿( êinteger;°dONLNdì #z)ê/* Font Size */°dONLNd™
  4761. #)Í\°dONLNd≠"ê.¥(+êStyle;°dONLNdπ" .Ä)ê/* Font Style */°dONLNd—"
  4762. .)Í\°dONLNd‘-ê9Δ(6ê    RsrcType;°dONLNd‚- 9⁄)ê/* Target Font Resource Type */°dONLNd-
  4763. 9)Í\°dONLNd8êD¿(Aêinteger;°dONLNd8 D™)ê/* Target Attributes */°dONLNd28
  4764. D)Í\°dONLNd5CêOfi(Lê
  4765. SrcPartsList;°dONLNdFC O»)ê/* Optional source pieces */°dONLNdeY~eÃ(b~
  4766. type 'inff' {°dONLNdtdêp¿+ switch {°dONLNdo¢{+
  4767. case format2:°dONLNdêz¥Ü+ key integer = 2;°dONLNd£zDܬ)ê/*format version 2 */°dONLNdºÖ¥ë,(é¥fontFamilyAtomFlags;°dONLNd“ÖDë¬)ê/* Font Atom Flags */°dONLNdÎê¥úˆ(ô¥ fileSpecID;°dONLNd˚êDú»)ê/* Target File Spec */°dONLNdõ¥߈(§¥ fileSpecID;°dONLNd%õDßÊ)ê/* FOND Source File Spec */°dONLNdD¶¥≤‰(Ø¥integer;°dONLNdR¶D≤Ï)ê/* Target FOND Attributes */°dONLNdr±¥Ω(∫¥unsigned longInt;°dONLNdܱDΩ™)ê/* Family Size */°dONLNdõº¥»fi(≈¥rsrcID;°dONLNd®ºD»‡)ê/* Target Family Number */°dONLNdΔ«¥”‰(–¥switch {°dONLNd““¥fi * case entireFamily:°dONLNdË›¥È∫*  °dONLNdÍ›ΔÈ&)key integer = 1;°dONLNd˛Ë¥ÙV(Ò¥case explicitFamilyMembers:°dONLNdÛΔˇ&+ key integer = 2;°dONLNd3˛Δ
  4768. Œ* ,unsigned integer = $$CountOf(StrikeEntries);°dONLNdd    Δb* wide array StrikeEntries {°dONLNdÑÿ + Strike;°dONLNdèD )l$/* Source for each of the strikes */°dONLNd∏Δ+“((Δ};°dONLNdæ*¥6¿(3¥};°dONLNdƒ5¥Afi* rsrcID;°dONLNd—5DA»)ê/* Atom Extender ID */°dONLNdÎ@¥L(I¥evenPaddedString;°dONLNdˇ@DL»)ê/* Atom Description */°dONLNdK¥W(T¥evenPaddedString;°dONLNd-KDW™)ê/* Family Name */°dONLNd@Vêbú(_ê};°dONLNdCa~mä(j~};
  4769.     °dONLNdF}~à’*Flag Descriptions
  4770. °dONLNdXã~ót*)deleteWhenRemoving/dontDeleteWhenRemoving°dONLNdÉñ¢ +ê ;Determines if specific font strikes or the entire family is°dONLNdø¢ÆÉ* deleted during a removal.°dONLNd⁄∂¬C* Using with °dONLNdÂ∂C¬÷)5explicitFamilyMembers°dONLNd˙∂÷¬ )ì  copy option°dONLNd¬Œd(À— When using the °dONLNd¬dŒ–)VdeleteWhenRemoving°dONLNd*¬–Œ")l flag, if the target°dONLNd?Œ⁄
  4771. (◊;font strike exists and the user clicks Remove the strike isˇdˇ ˇˇˇˇd
  4772. d, Palatino
  4773. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4774.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú49
  4775. °dONLNdQ],(ZEdeleted.  If a strike does not exist on the target disk, this flag is°dONLNdF]i'* Aignored.  If all font strikes for a given family are removed, the°dONLNdàiu…* )family’s ‘FOND’ resource is also deleted.°dONLNdµ}âC* Using with ,
  4776. Courier°dONLNd¿}Câó)5 entireFamily°dONLNdÃ}óâÕ)T  copy option°dONLNdÿ}Õâ#)6 — When using the°dONLNdÍâïz(ídeleteWhenRemoving°dONLNd¸âzï-)l' flag, the family’s ‘FOND’ resource and°dONLNd$ï°(ûall°dONLNd'ï°œ)*  font strikes for the family are deleted.°dONLNdS©µ,(≤?Note that the font atom must be part of a package that uses the°dONLNd쵡D*     removable°dONLNdúµD¡\)6 flag.°dONLNd§…~’å(“~-deleteWhenInstalling/dontDeleteWhenInstalling°dONLNd“‘‡ +ê ;Determines if specific font strikes or the entire family is°dONLNd‡Ïfi* .deleted during an installation when using the °dONLNd<‡fiÏ)–dontCopy°dONLNdD‡Ï&)0 flag.°dONLNdLÙC(˝ Using with °dONLNdWÙC÷)5explicitFamilyMembers°dONLNdlÙ÷ )ì  copy option°dONLNdy d(    — When using the °dONLNdäd –)VdeleteWhenRemoving°dONLNdú– ")l flag, if the target°dONLNd± 
  4777. (;font strike exists and the user clicks Remove the strike is°dONLNdÌ$,* Edeleted.  If a strike does not exist on the target disk, this flag is°dONLNd3$0'* Aignored.  If all font strikes for a given family are removed, the°dONLNdu0<…* )family’s ‘FOND’ resource is also deleted.°dONLNd¢DPC* Using with °dONLNd≠DCPó)5 entireFamily°dONLNdπDóPÕ)T  copy option°dONLNd≈DÕP#)6 — When using the°dONLNd◊P\z(YdeleteWhenRemoving°dONLNdÈPz\-)l' flag, the family’s ‘FOND’ resource and°dONLNd\h(eall°dONLNd\hœ)*  font strikes for the family are deleted.°dONLNd@p|"(yThe °dONLNdDp"|ö)deleteWhenInstalling°dONLNdXpö|)x flag is primarily used for°dONLNdt|à#(Ö?deleting previously installed font resources that are no longer°dONLNd¥àî1* needed.°dONLNdºú~®Ã(•~
  4778. copy/dontCopy°dONLNd ú®)ê<Determines if the font resources are copied or not during an°dONLNd®¥±* %installation.  Note that some flags (°dONLNd,®±¥)£leaveAloneIfNewer°dONLNd=®¥)f,°dONLNd?¥¿V(Ω keepExisting°dONLNdK¥V¿[)H, °dONLNdM¥[¿£) copyIfUpdate°dONLNdY¥£¿)H) can prevent copying from°dONLNdt¿Ã⁄(…,happening under the circumstances specified.°dONLNd£‘~‡D(›~!noEncodedFONDRsrc/encodedFONDRsrc°dONLNd≈flΠ+ê <Allows ‘FOND’ resources to be encoded into the resource type°dONLNdΘÙ* 3‘iFND’ when compessing the font resources.  This is°dONLNd6˜* 4recommended to help prevent the system software from°dONLNdk* 8becoming confused when finding a ‘FOND’ resource in your°dONLNd§ * ;source file that may reference not existent font resources.°dONLNd‡#~/(,~tgtRequired/noTgtRequired°dONLNd˙.:+ê @The target file must already exist.  If the target file does not°dONLNd;:F* =exist, the user is warned that a target file is needed.  When°dONLNdyFR9*
  4779. using the °dONLNdÉF9Rá)+
  4780. noTgtRequired°dONLNdêFáR)N" flag and the target file does not°dONLNd≥R^´([%exist, the Installer will create one.°dONLNdŸf~r (o~keepExisting/updateExisting°dONLNdıq}-+ê @Allows the scriptwriter to preserve existing font resources when°dONLNd6}â9*
  4781. using the °dONLNd@}9âQ)+copy°dONLNdD}Qât) and/or °dONLNdL}tâŒ)#deleteOnInstall°dONLNd[}Œâ
  4782. )Z flag.  Use the°dONLNdkâïV(í keepExisting°dONLNdwâVï+)H1 flag to prevent the Installer from disturbing an°dONLNd©ï°±(û&existing target font strike or family.°dONLNd”©µC* Using with °dONLNdfi©Cµ÷)5explicitFamilyMembers°dONLNdÛ©÷µ )ì  copy option°dONLNd    µ¡d(æ— When using the °dONLNd    µd¡¨)V keepExisting°dONLNd    µ¨¡))H flag and a specific strike in°dONLNd    <¡Õ( >the ‘FOND’ resource already exists in the target file, it will°dONLNd    {ÕŸU* not be replaced.ˇ4dˇ ˇˇˇˇd
  4783. d, Palatino
  4784. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4785.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú50
  4786. °dONLNdQ]C(Z Using with ,
  4787. Courier°dONLNd QC]ó)5 entireFamily°dONLNdQó]Õ)T  copy option°dONLNd#QÕ]#)6 — When using the°dONLNd5]iV(f keepExisting°dONLNdA]Vi#)H- flag and the ‘FOND’ resource already exists,°dONLNdoiu≥(r&no strikes will be copied or replaced.°dONLNdô}âç*No copying will occur if the °dONLNd∂}çâ·)updateExisting°dONLNdƒ}·â)T
  4788.  flag is used°dONLNd“âï9(í    with the °dONLNd€â9ïÅ)+ copyIfUpdate°dONLNdÁâÅïô)H flag.°dONLNdÓù~©2(¶~copyIfUpdate/copyIfNewOrUpdate°dONLNd
  4789. ®¥+ê <Allows the scriptwriter to update a font resource only if it°dONLNdJ¥¿{* already exists.  Use the °dONLNdc¥{¿√)m copyIfUpdate°dONLNdo¥√¿$)H flag to prevent a new°dONLNdÜ¿Ãä(…resource from being created.°dONLNd¶‘‡C* Using with °dONLNd±‘C‡÷)5explicitFamilyMembers°dONLNdΔ‘÷‡ )ì  copy option°dONLNd”‡Ïd(È— When using the °dONLNd‰‡dϨ)V copyIfUpdate°dONLNd‡¨Ï)H flag, a specific strike is°dONLNd ϯ)(ıBcopied to the target file only if the strike already exists in the°dONLNdO¯@* target file.°dONLNd^ C* Using with °dONLNdi Có)5 entireFamily°dONLNdu óÕ)T  copy option°dONLNdÅ Õ()6 — The entire source°dONLNdñ$+(!Cfont family will be copied if any strikes exist in the target file.°dONLNd‹,8**If the °dONLNd„,*8r) copyIfUpdate°dONLNdÔ,r8‘)H flag is used with the °dONLNd,‘8)b keepExisting°dONLNd8Dù(A!flag, then no copying will occur.°dONLNd5L~X\(U~%ignoreProtection/dontIgnoreProtection°dONLNd[Wc+ê =Determines if the user should be alerted if any font resource°dONLNdôco˝* 7with its protected bit set will be replaced or deleted.°dONLNd‘wÉC* Using with °dONLNdflwCÉ÷)5explicitFamilyMembers°dONLNdÙw÷É )ì  copy option°dONLNdÉèd(å— When using the °dONLNdÉdè‹)VdontIgnoreProtection°dONLNd&É‹è)x
  4790.  flag, if the°dONLNd4èõ(ò;‘FOND’ resource or any font resource to be replaced has the°dONLNdpõߘ* 6protection flag set, the user will be alerted, and the°dONLNdßß≥∫* 'installation will be canceled.  Use the°dONLNdœ≥øÜ* dontIgnoreProtection°dONLNd„≥Üø)x" flag if preserving protected font°dONLNdøÀ¿(»(resources is important.  When using the °dONLNd.ø¿À )≤ignoreProtection°dONLNd?À◊,(‘Aflag the font resources are deleted from or updated in the target°dONLNdÅ◊„Ï* 5file even if it any are protected in the target file.°dONLNd∏ΘC* Using with °dONLNd√ÎC˜ó)5 entireFamily°dONLNdœÎó˜Õ)T  copy option°dONLNd€ÎÕ˜#)6 — When using the°dONLNd̘Ü(dontIgnoreProtection°dONLNd˜Ü!)x% flag the user is alerted only if the°dONLNd'*( A‘FOND’ resource is protected, but if any other font resources are°dONLNdi* ;protected, they will be replaced without alerting the user.°dONLNd¶'W* When using the °dONLNdµW'∑)IignoreProtection°dONLNd≈∑'-)` flag the font resources are°dONLNd‚'3(0=deleted from or updated in the target file even if it any are°dONLNd 3?ä* protected in the target file.°dONLNd>G~S&(P~srcNeedExist/srcNeedNotExist°dONLNd[R^&+ê >Determines whether the source font resources must exist on the°dONLNdö^jk* source disk.  Use the °dONLNd∞^kj≈)]srcNeedNotExist°dONLNdø^≈j)Z flag if the source°dONLNd”jv'(sBresources can optionally reside on the source disk.  If the source°dONLNdvÇ&* Bfile or source resources are not found, the atom it is ignored and°dONLNdYÇé±* $the installation continues normally.°dONLNd~ñ~¢¿(ü~ byID/byName°dONLNdäñ¢*)ê?Determines how the font strike resources should be found in the°dONLNd ¢Æz* source files. If using the °dONLNd¢zÆí)lbyID°dONLNdÈ¢íÆ,)% flag the font strike’s resources are°dONLNd    Æ∫*(∑Cfound in the source file using only the ID.  If you want to require°dONLNd    S∫Δ‰* /the resource name to match as well then use the°dONLNd    ÉΔ“\*
  4791. nameMustMatch°dONLNd    êΔ\“∫)N flag.  Note that the °dONLNd    ¶Δ∫““)^byID°dONLNd    ™Δ““) flag can only be°dONLNd    º“fiô(€used when installing using the °dONLNd    €“ôfi)ãexplicitFamilyMembers°dONLNd    “fi.)~ copyˇÓdˇ ˇˇˇˇd
  4792. d, Palatino
  4793. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4794.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú51
  4795. °dONLNdQ](Z>option and split source resources are specified.  If using the,
  4796. Courier°dONLNd?]i2* byName°dONLNdE]2i-)$< flag the font strike resources are found in the source file°dONLNdÇiu≤(r%using only the name specified in the °dONLNdßi≤u)§Source Piece Rsrc°dONLNdπuÅ&(~Name°dONLNdΩu&ÅB) field.°dONLNd≈â~ï2(í~nameMustMatch/nameNeedNotMatch°dONLNd‰î†+ê ?Specifies if the font strike resources found in the source file°dONLNd$†¨Õ* *using their IDs must have the name in the °dONLNdN†Õ¨)ø Source Piece°dONLNd[¨∏D(µ    Rsrc Name°dONLNdd¨D∏¶)6 field.  Note that the °dONLNd{¨¶∏Ù)b
  4797. nameMustMatch°dONLNdà¨Ù∏)N     flag can°dONLNdí∏ƒπ(¡&only be used when installing using the°dONLNdπƒ–å* explicitFamilyMembers°dONLNdŒƒå–
  4798. )~ copy option and split source°dONLNdÏ–‹(Ÿ6resources are specified.  This flag is ignored if the °dONLNd"–‹)‚byName°dONLNd(–‹))$ flag°dONLNd.‹Ë/(Âis used.
  4799.     °dONLNd7Ú~˝ÿ(˙~Field Descriptions
  4800. °dONLNdJ~ *Target File Spec ID°dONLNd^  )êAThe resource ID of a Target File Spec script resource (‘intf’, or°dONLNd† !* B‘infs’ for pre-4,0 scripts) describing the file on the target disk°dONLNd„$* <where the resource will be deleted, created, or updated.  (2°dONLNd$(!-°dONLNd $0*(-bytes)°dONLNd(8~D(A~Source File Spec ID°dONLNd<8D$)ê@The resource ID of a Source File Spec script resource describing°dONLNd}DP** @the file on the source disk that contains the 'FOND' resource to°dONLNdæP\í* be copied into the target file.°dONLNd‡dpC* Using with °dONLNdÎdCp÷)5explicitFamilyMembers°dONLNdd÷p )ì  copy option°dONLNd d p#)6 — If°dONLNdp|(y=no optional split source information is provided, the strikes°dONLNdP|à"* ?specified must also be contained in the same file as the source°dONLNdêàî* :‘FOND’ resource.  Optional split source information always°dONLNdÀî†* <overrides that default source for those strikes that use it.°dONLNd    ®¥C* Using with °dONLNd®C¥ó)5 entireFamily°dONLNd ®ó¥Õ)T  copy option°dONLNd,®Õ¥()6 — The source strike°dONLNdA¥¿(Ω:resources referenced in the source 'FOND' resource must be°dONLNd|¿Ã+* @contained in the same source file as the source 'FOND' resource.°dONLNd¿‘‡#*AIf you’re just deleting strikes and therefore don’t need a source°dONLNd‡Ï°* %file, set this field to 0.  (2-bytes)°dONLNd(Ù~(˝~Target FOND Attributes°dONLNd?Ù+)ê?The resource attributes that will be given to the target 'FOND'°dONLNd (* @resource during installation.  See Inside Macintosh Vol. I, page°dONLNd¿ * >111 for more information about resource attributes.  (2-bytes)°dONLNdˇ ~,fi()~Font Family Size°dONLNd ,)ê<The size in bytes of all font resources including the 'FOND'°dONLNdM,8* ?resource to be installed or deleted.  This field is used by the°dONLNdç8D* ?Installer in figuring the sizes for an installation.  (4-bytes)°dONLNdÕL~X“(U~Target FOND ID°dONLNd‹LX
  4801. )ê7The resource ID that will be given to the target 'FOND'°dONLNdXd&* >resource.  Normally, this ID should also be the same ID as the°dONLNdSdp.* @resource ID of the source 'FOND' resource.  The Installer always°dONLNdîp|&* =sets the family number field contained in the ‘FOND’ resource°dONLNd“|à&* >to the resource ID of the ‘FOND’ when it is copied or updated.°dONLNd    àî7*     (2-bytes)°dONLNd    ú~®¸(•~How-To-Copy Value Key°dONLNd    2ú®)ê<Specifies how the font resources will be copied, or deleted.°dONLNd    o®¥‰* 0Currently, the two copy options are available:  °dONLNd    ü®‰¥,)÷ entireFamily°dONLNd    ¨¥¿Q(ΩValue (1), and °dONLNd    ª¥Q¿œ)CexplicitFamilyMembers°dONLNd    –¥œ¿,)~ Value (2).  (2-bytes)°dONLNd    Ë»‘<(—
  4802. Using the °dONLNd    Ú»<‘ê). entireFamily°dONLNd    ˛»ê‘Δ)T  copy option°dONLNd
  4803.  
  4804. »Δ‘()6 — Tells the Installer°dONLNd
  4805. !‘‡)(›@that all strikes specified in the source 'FOND' resource will beˇFdˇ ˇˇˇˇd
  4806. d, Palatino
  4807. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4808.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú52
  4809. °dONLNdQ](Z>copied.  The 'FONT', 'NFNT', or 'sfnt' resources must exist in°dONLNd?]i#* =the same source file as the 'FOND' resource.  The Copy Entire°dONLNd}iu#* <Family Value is provided to copy small, simple font families°dONLNd∫uÅ    * 9with minimal scripting effort.  Since the target resource°dONLNdÙÅç$* @attributes cannot be specified, the target resource inherits the°dONLNd5çô* 4source's.  If the Font Family Atom Flags are set for,
  4810. Courier°dONLNdjô•Ä* deleteWhenRemoving °dONLNd}ôÄ•ã)ror °dONLNdÄôã•) deleteWhenInstalling &°dONLNdó•±>(ÆdontCopy°dONLNdü•>±.)05 the target 'FOND' resource and ALL of its referenced°dONLNd’±Ω(∫<strikes will be deleted from the target file upon removal or°dONLNdΩ…u* installation.  (2-bytes)°dONLNd,—›<*
  4811. Using the °dONLNd6—<›œ).explicitFamilyMembers°dONLNdK—œ›)ì  copy option°dONLNdW—›+)6 — Tells°dONLNd`›È(Ê;the Installer that one or more strikes are specified in the°dONLNdúÈı°* !following member list.  (2-bytes)°dONLNdæ˝~    ∫(~
  4812. Point Size°dONLNd»˝∫    º)< °dONLNd ˝    Ã)T*The family member's point size.  (2-bytes)°dONLNdı~ú(~Style°dONLNd˙úû) °dONLNd¸ )r@Contains flags describing the style of the font.  The style bits°dONLNd=)è* are defined below.  (2-bytes)°dONLNd[)5'* Bit 0:°dONLNdb)25h)$ Set for Bold°dONLNdo5A'(>Bit 1:°dONLNdv52Al)$Set for Italic°dONLNdÖAM'(JBit 2:°dONLNdåA2MÄ)$Set for Underline°dONLNdûMY'(VBit 3:°dONLNd•M2Yu)$Set for Outline°dONLNdµYe'(bBit 4:°dONLNdºY2ex)$Set for Shadow°dONLNdÀeq'(nBit 5:°dONLNd“e2qÇ)$Set for Condensed°dONLNd‰q}'(zBit 6:°dONLNdÎq2}q)$Set for Extend°dONLNd˙}ââ(ÜAll other bits are reserved.°dONLNdë~ùÃ(ö~
  4813. Resource Type°dONLNd%ëù,)êCThe resource type of the target or source font resource.  This will°dONLNdiù©"* ?be the type of the font resource created by combining the split°dONLNd©©µ* Aresources.  If no split resource information is given, this field°dONLNdε¡Ó* 5should be the type of the source font resource (e.g. °dONLNd µÓ¡)‡'FONT',°dONLNd(¡Õt( 'NFNT', or 'sfnt'°dONLNd9¡tÕ®)f
  4814. ).  (4-bytes)°dONLNdG’~·(fi~Resource Attributes°dONLNd[’·)ê=The resource attributes that will be given to the target font°dONLNdô·Ì(* Bresource.  The Split Resource list specifies one or more resources°dONLNd‹Ì˘* 9that make up the font resource when combined in the order°dONLNd˘Y* listed.  (2-bytes)°dONLNd)
  4815. ~ (~Split Resource File Spec ID°dONLNdE$+ê <The Split Resource File Spec ID field is a 2-byte field that°dONLNdÇ$0* =specifies the file on the source disk that contains the split°dONLNd¿0<•* #resource to be combined.  (2-bytes)°dONLNd‰D~P(M~Split Resource Type°dONLNd¯DP)ê>The resource type of the source split resource.  Usually, this°dONLNd7P\ú* !should be type 'part'.  (4-bytes)°dONLNdYd~p‰(m~Split Resource ID°dONLNdkdp¸)ê8The resource ID of the source split resource.  (2-bytes)°dONLNd§x~Ñ(Å~Split Resource Size°dONLNd∏xÑ)ê@The exact size in bytes of the source split resource.  (4-bytes)°dONLNd˘å~ò(ï~Split Resource Name°dONLNd
  4816. åò)ê@The name of the source split resource.  If the resource is being°dONLNdNò§T* found using the °dONLNd^òT§x)FbyName°dONLNddòx§()$* flag, this field must be filled.  To help°dONLNdè§∞#(≠@ensure that the correct resource is being installed, the name of°dONLNd–∞º* <the resource in the source file must match this field if the°dONLNd    
  4817. º»* =resource is being found by name.  (even-padded Pascal string)ˇ¥dˇ ˇˇˇˇd
  4818. d, Palatino
  4819. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4820.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú53,
  4821. Courier
  4822. °dONLNdQ~]fi(Z~Atom Extender ID°dONLNdQ]*)êAThe resource ID of an Atom Extender ‘inex’ script resource.  This°dONLNdS]i
  4823. * 8Atom Extender will be called during copying of each font°dONLNdåiux* resource part.  (2-bytes)°dONLNd¶}~â&(Ü~Font Family Atom Description°dONLNd√àî$+ê @A Pascal string describing the atom.  This field is used as part°dONLNdî†.* Dof the status dialog.  If this field is not empty, the status dialog°dONLNdI†¨* 4displays “Reading <Description String>”, or “Writing°dONLNd~¨∏,* A<Description String>”.  If this field is empty, the status dialog°dONLNd¿∏ƒ* 8displays “Reading font: <Font Family Name>”, or “Writing°dONLNd˘ƒ–* 7font: <Font Family Name>”.  (even-padded Pascal string)°dONLNd1ÿ~‰fi(·~Font Family Name°dONLNdBÿ‰)ê:The family name.  The family name will be used to find the°dONLNd}‰.* ?source and target 'FOND' resource.  (even-padded Pascal string)
  4824. °dONLNdΩ6W(6 About the ResMerge Atom (‘inrm’)"°∂ 40°∂°∂
  4825. °dONLNdfi!~-+H^The ResMerge Atom can be used to copy all resources from a source file to a target file.  Each°dONLNd=-~9"* _resource is copied separately, replacing an existing resource of the same type and ID.  Because°dONLNdù9~E* Vthe ResMerge Atom offers no options, you may find that you will need to use individual°dONLNdÙE~QG* ,Resource Atoms to handle special situations.°dONLNd!Y~e*YThe ResMerge Atom is unique from using Resource Atoms because anyone can add to or delete°dONLNd{e~q* \resources from the source file without changing the atom.  This is acceptable as long as the°dONLNdÿq~}+* bInstaller can successfully preflight the required disk space.  A field in the atom holds the total°dONLNd;}~â"* dsize the resources expect to occupy in the target file.  This flexibility comes at a cost to ease of°dONLNd†â~ï* Yuse because the Installer cannot determine during preflighting how many resources will be°dONLNd˙ï~°-* _replaced, thus not requiring additional disk space.  We will therefore usually overestimate the°dONLNdZ°~≠
  4826. * Xrequired disk space, forcing the user to make more space available than will probably be°dONLNd≥≠~π¨*
  4827. necessary.
  4828. °dONLNdæ—6Â(‡6Using the ResMerge Atom"°∂ Â4Â0°∂°∂
  4829. °dONLNd÷Í~ˆ+HVThe ResMerge Atom offers limited options, so determining when to use the ResMerge Atom°dONLNd-ˆ~+* ]versus separate Resource Atoms or a File Atom is important.  The main purpose of the ResMerge°dONLNdã~¸* RAtom is to provide a simple high-level resource copy mechanism without forcing the°dONLNdfi~T* /scriptwriter to create numerous Resource Atoms.°dONLNd"~.'*[The Installer executes a ResMerge Atom by automatically converting the atom into individual°dONLNdj.~:** _Resource Atoms when the Installer is ready to begin reading from the source disk.  The Resource°dONLNd :~F:* )Atom is created with the following flags:,
  4830.  
  4831. Zapf Dingbats
  4832.     °dONLNdÙP~YÖ*n
  4833. °dONLNdˆNêZ)IdontDeleteWhenRemoving — The ResMerge Atom does nothing during a removal.
  4834.     °dONLNd    @d~mÖ(k~n
  4835. °dONLNd    Bbên)dontDeleteWhenInstalling.
  4836.     °dONLNd    \x~ÅÖ(~n
  4837. °dONLNd    ^vêÇ®)copy.
  4838.     °dONLNd    då~ïÖ(ì~n
  4839. °dONLNd    fäêñÂ)MnoTgtRequired — The target file will be created if it does not already exist.
  4840.     °dONLNd    ¥†~©Ö(ß~n
  4841. °dONLNd    ∂ûê™˝)OupdateExisting — Existing resources with the same type and ID will be replaced.
  4842.     °dONLNd
  4843. ¥~ΩÖ(ª~n
  4844. °dONLNd
  4845. ≤êæı)copyIfNewOrUpdate.
  4846.     °dONLNd
  4847. »~—Ö(œ~n
  4848. °dONLNd
  4849. Δê“,)[srcNeedNotExist — Doesn’t really matter because if it didn’t exist we would not be creating°dONLNd
  4850. y“êfi* this Resource Atom to copy it.ˇ∫dˇ ˇˇˇˇd
  4851. d, Palatino
  4852. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4853.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú54,
  4854.  
  4855. Zapf Dingbats
  4856. °dONLNdS~\Ö(Z~n
  4857. °dONLNdQê]™)byID.
  4858.     °dONLNdg~pÖ(n~n
  4859. °dONLNd
  4860. eêq-)UnameNeedNotMatch — The name is ignored, but the new name will replace the old name if°dONLNd`qê}º*
  4861. different.
  4862.     °dONLNdká~íö(è~NOTE
  4863. °dONLNdpï~°%*[System Software scriptwriters must use care when using the ResMerge Atom because on pre-7.0°dONLNdð~≠
  4864. * Wsystems we determine if the Folder Manager will be available based on the presence of a°dONLNd$≠~π&* \Resource Atom copying a ‘fld#’ resource.  This means a separate Resource Atom must always be°dONLNdÅπ~≈%* (created to install the ‘fld#’ resource. 
  4865.     °dONLNd©ª%ƒ,)ßu
  4866. °dONLNd´›6Ò(Ï6ResMerge Atom Reference"°∂ Ò4Ò0°∂°∂
  4867. °dONLNd√ˆ~ +HHThe format of the ResMerge Atom is simple.  Its template is shown below.,
  4868. Courier°dONLNd ~®*#define°dONLNd¥)6resMergeAtomFlags°dONLNd2¯˛(¯\°dONLNd6¢)(&¢
  4869. fill bit[16];°dONLNdD3~?Ã(<~
  4870. type 'inrm' {°dONLNdT>¢J“+$ switch {°dONLNd`I¥U+
  4871. case format0:°dONLNdrTΔ`&+ key integer = 0;°dONLNdÖTV`")ê"/* ResMerge Atom Format version */°dONLNd¨_Δk (hΔmergeAtomFlags;°dONLNdæ_VkÏ)ê/* ResMerge Atom Flags */°dONLNd‹jΔv,(sΔunsigned longInt;°dONLNdjVvÚ)ê/* Total Resources Size */°dONLNduΔÅ(~Δ fileSpecID;°dONLNduVÅ)ê/* Target File Spec. Rsrc ID */°dONLNdCÄΔå(âΔ fileSpecID;°dONLNdSÄVå)ê/* Source File Spec. Rsrc ID */°dONLNdwãΔó,(îΔevenPaddedString;°dONLNdããVóÊ)ê/* Status Description */°dONLNdßñ¢¢Æ(ü¢};°dONLNd™°~≠ä(™~};
  4872.     °dONLNd≠Ω~»◊*Field descriptions
  4873. °dONLNd¡À~◊*ResMerge Atom Flags°dONLNd‘À◊Ú)r °dONLNd÷À◊)=Currently reserved for use by Apple Computer, Inc.  (2-bytes)°dONLNdfl~θ(Ë~Total Resources Size °dONLNd*flÎ)ê@The size that all resources will occupy in the target file.  For°dONLNdkΘ* @most purposes, the size of the source file’s resource fork is an°dONLNd¨˜(* Aadequate estimate.  This field is used by the Installer to figure°dONLNdÓ’* -the amount of disk space required.  (4-bytes)°dONLNd~#( ~Target File Spec. Rsrc ID°dONLNd7".+ê >The resource ID of a Target File Spec (‘intf’) script resource°dONLNdv.:* >describing the desired location of the target file.  (2-bytes)°dONLNdµB~N(K~Source File Spec. Rsrc ID°dONLNd–MY+ê >The resource ID of a Source File Spec (‘infs’) script resource°dONLNdYeÚ* 6describing the location of the source file.  (2-bytes)°dONLNdFm~yÍ(v~Status Description°dONLNdYmy-)ê@An optional string that is displayed in the Status dialog during°dONLNdöyÖ#* ;execution of the ResMerge Atom. (even-padded Pascal string)
  4874. °dONLNd◊ù6±5(¨6About the Folder Atom (‘infm’)"°∂ ±4±0°∂°∂
  4875. °dONLNdˆ∂~¬+H`The Folder Atom can be used to copy all files from the root-level of a source folder to the root°dONLNdV∂¬#(ø-°dONLNdW¬~Œ (À~alevel of a target folder.  Each file is copied separately, replacing an existing file of the same°dONLNdπŒ~⁄* ]name.  Folders within the source folder are ignored, and must be copied using separate Folderˇ6dˇ ˇˇˇˇd
  4876. d, Palatino
  4877. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4878.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú55
  4879. °dONLNdQ~](Z~YAtoms.  Because the Folder Atom offers no options, you may find that you will need to use°dONLNdZ]~iå* <individual Resource Atoms to copy some or all the resources.°dONLNdóq~}&*^The Folder Atom is unique from using File Atoms because anyone can add to or delete files from°dONLNdˆ}~â¯* Uthe source folder without changing the atom.  This is OK as long as the Installer can°dONLNdLâ~ï* ]successfully preflight the required disk space.  A field in the atom holds the total size the°dONLNd™ï~°-* esource files.  This flexibility comes at a cost to ease of use because the Installer cannot determine°dONLNd°~≠&* ^during preflighting how many files will be replaced, thus not requiring additional disk space.°dONLNdp≠~π&* ]We will therefore usually overestimate the required disk space, forcing the user to make more°dONLNdŒπ~≈\* 0space available than will probably be necessary.
  4880.     °dONLNdˇœ~⁄ö*NOTE
  4881. °dONLNd›~È-*bThe Folder Atom only copies the files at the root level of the source folder.  Nested folders must°dONLNdgÈ~ıo* 4be copied separately with additional Folder Atoms.  ,
  4882.  
  4883. Zapf Dingbats
  4884.     °dONLNdõÎoÙv)Òu
  4885. °dONLNdù
  4886. 6!Ú(6Using the Folder Atom"°∂ !4!0°∂°∂
  4887. °dONLNd≥&~2(+H]The Folder Atom offers no options, so determining when to use the Folder Atom versus separate°dONLNd2~>* YFile Atoms is important.  The main purpose of the Folder Atom is to provide a simple high°dONLNdj2>(;-°dONLNdk>~J)(G~^level file copy mechanism without forcing the scriptwriter to create numerous File Atoms.  The°dONLNd J~V™* AFolder Atom does not support decompression or version comparison.°dONLNd ^~j.*^The Installer executes a Folder Atom by automatically converting the atom into individual File°dONLNdkj~v* \Atoms when the Installer is ready to begin reading from the source folder.  The File Atom is°dONLNd»v~Ç* !created with the following flags:
  4888.     °dONLNdÍå~ïÖ*n
  4889. °dONLNdÏäêñÙ)GdontDeleteWhenRemoving — The Folder Atom does nothing during a removal.
  4890.     °dONLNd4†~©Ö(ß~n
  4891. °dONLNd6ûê™)dontDeleteWhenInstalling.
  4892.     °dONLNdP¥~ΩÖ(ª~n
  4893. °dONLNdR≤êæ®)copy.
  4894.     °dONLNdX»~—Ö(œ~n
  4895. °dONLNdZΔê“))[dontIgnoreLockedFile — The user is notified about locked target files, and the installation°dONLNd∂“êfi¡* is stopped.
  4896.     °dONLNd¬Ë~ÒÖ(Ô~n
  4897. °dONLNdƒÊêÚ.)_dontSetFileLocked or setFileLocked — If the source file is locked it will be locked after it is°dONLNd$Úê˛±* copied.
  4898.     °dONLNd,~Ö(~n
  4899. °dONLNd.ê˘)LuseSrcCrDateToCompare — Since no version compare procedure can be specified.
  4900.     °dONLNd{~%Ö(#~n
  4901. °dONLNd}ê&,)[srcNeedNotExist — Doesn’t really matter because if it didn’t exist we would not be creating°dONLNdŸ&ê2* this File Atom to copy it.
  4902.     °dONLNdÙ<~EÖ(C~n
  4903. °dONLNdˆ:êFê)7rsrcForkInRsrcFork — Since no decompression is allowed.
  4904.     °dONLNd.P~YÖ(W~n
  4905. °dONLNd0NêZÃ)DupdateExisting — Existing files with the same name will be replaced.
  4906.     °dONLNdud~mÖ(k~n
  4907. °dONLNdwbênı)copyIfNewOrUpdate.
  4908.     °dONLNdäx~ÅÖ(~n
  4909. °dONLNdåvêÇI)+rsrcFork — Copy resource fork if it exists.
  4910.     °dONLNd∏å~ïÖ(ì~n
  4911. °dONLNd∫äêñA)'dataFork — Copy data fork if it exists.
  4912. °dONLNd‚™~πz(µ~'Specifying the Source and Target Folder"°∂ ∏|∏0°∂°∂
  4913. °dONLNd    
  4914. Ω~…%*cThe standard ‘infs’ and ‘intf’ file spec resources are used to specify the source and target folder°dONLNd    n…~’* with several differences:ˇ*dˇ ˇˇˇˇd
  4915. d, Palatino
  4916. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4917.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú56,
  4918.  
  4919. Zapf Dingbats
  4920. °dONLNdS~\Ö(Z~n
  4921. °dONLNdQê])WThe path name is similar to normal file specs, but the path should end with the name of°dONLNdZ]êi»* Ithe source or target folder.  A colon at the end of the path is optional.
  4922.     °dONLNd§s~|Ö(z~n
  4923. °dONLNd¶qê}¶)<All File Spec flags are ignored when used with Folder Atoms.
  4924.     °dONLNd„á~êÖ(é~n
  4925. °dONLNdÂÖêë)VThe File Type, File Creator and Creation Date fields are ignored when used with Folder°dONLNd<ëêù∞* Atoms.
  4926.     °dONLNdDß~≤ö(Ø~NOTE
  4927. °dONLNdIµ~¡+*^The reserved folder path name “special-xxxx” cannot be used with Folder Atoms.  If you do, the°dONLNd®¡~Õ^* 3user will be told the script document is damaged.  
  4928.     °dONLNd€√^Ãe)‡u
  4929. °dONLNd›·~^(Ï~$Installing Folders with Custom Icons"°∂ Ô|Ô0°∂°∂
  4930. °dONLNdÙ~%*_The Folder Atom will automatically set the target folder to use the source folder’s custom icon°dONLNdb~ $* `if one exits.  Although the scriptwriter need not be aware of how the custom icon is stored, the°dONLNd√ ~* _Installer uses the File Atom’s feature of setting the target folder’s icon whenever the special°dONLNd#~$5* +invisible “Icon\n” file is written to disk.
  4931. °dONLNdO8~Gâ*")Creating Empty Folders with a Folder Atom"°∂ F|F0°∂°∂
  4932. °dONLNdyK~W+*gThe Installer will not create a target folder if there are no files are present in the source file.  If°dONLNd·W~c* ^you wish to create an empty folder, the easiest work around is to create a custom icon for the°dONLNd@c~o.* dsource folder, thereby causing the invisible “Icon\n” file to be copied, and the target folder to be°dONLNd•o~{£* created.
  4933. °dONLNdÆì6߯(¢6Folder Atom Reference"°∂ ß4ß0°∂°∂
  4934. °dONLNdƒ¨~∏º+HFThe format of the Folder Atom is simple.  Its template is shown below.,
  4935. Courier°dONLNd »~‘®*#define°dONLNd»¥‘)6folderAtomFlags°dONLNd0»
  4936. ‘(—
  4937. \°dONLNd4”¢fl(‹¢
  4938. fill bit[16];°dONLNdBÈ~ıÃ(Ú~
  4939. type 'infm' {°dONLNdRÙ¢“+$ switch {°dONLNd^ˇ¥ +
  4940. case format0:°dONLNdp
  4941. Δ&+ key integer = 0;°dONLNdÉ
  4942. V)ê /* Folder Atom Format version */°dONLNd®Δ!&(ΔfolderAtomFlags;°dONLNdªV!‡)ê/* Folder Atom Flags */°dONLNd◊ Δ,,()Δunsigned longInt;°dONLNdΠV,‡)ê/* Total Folder Size */°dONLNd+Δ7(4ΔrsrcID;°dONLNd+V7)ê/* Target File Spec. Rsrc ID */°dONLNd86ΔB(?ΔrsrcID;°dONLNdE6VB)ê/* Source File Spec. Rsrc ID */°dONLNdiAΔM,(JΔevenPaddedString;°dONLNd}AVMÊ)ê/* Status Description */°dONLNdòL¢XÆ(U¢};°dONLNdõW~cä(`~};
  4943.     °dONLNdûs~~ÿ*Field Descriptions
  4944. °dONLNd≤Å~ç‰*Folder Atom Flags°dONLNd√ʼnçÊ)f °dONLNd≈Åç)*=Currently reserved for use by Apple Computer, Inc.  (2-bytes)°dONLNdï~°Í(û~Total Folder Size °dONLNdï° )êBThe size of all files in the source folder.  This field is used by°dONLNdY°≠* >the Installer to figure the amount of disk space required.  (4°dONLNdó°≠(™-°dONLNdò≠π*(∂bytes)ˇ∂dˇ ˇˇˇˇd
  4945. d, Palatino
  4946. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4947.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú57,
  4948. Courier
  4949. °dONLNdQ~](Z~Target File Spec. Rsrc ID°dONLNd\h+ê >The resource ID of a Target File Spec (‘intf’) script resource°dONLNdZht"* @describing the desired location of the target folder.  (2-bytes)°dONLNdõ|~à(Ö~Source File Spec. Rsrc ID°dONLNd∂áì+ê >The resource ID of a Source File Spec (‘infs’) script resource°dONLNdıìü˝* 8describing the location of the source folder.  (2-bytes)°dONLNd.ß~≥Í(∞~Status Description°dONLNdAß≥-)ê@An optional string that is displayed in the Status dialog during°dONLNdÇ≥ø* 9execution of the Folder Atom. (even-padded Pascal string)
  4950. °dONLNdΩ◊6Î(Ê6Using Action Atoms (‘inaa’)"°∂ Î4Î0°∂°∂
  4951. °dONLNdŸ~¸+H^Action Atoms are used to run a code resource at the beginning and/or end of an installation or°dONLNd8¸~ß* removal.°dONLNdA~Û*To use an Action Atom, an °dONLNd[Û)u'inaa'°dONLNda-)$A resource must first be added to the script.  This atom specifies°dONLNd£~(+(%~_the resource which contains an executable piece of code.  The user-defined Action Atom code can°dONLNd(~4* bbe executed at two different times for installations.  One is after the user clicks on the Install°dONLNdf4~@%* cbutton but before installation begins.  The other is after the installation is finished, but before°dONLNd @~L* `the user is asked to quit or continue.  The code can also be executed at two different times for°dONLNd+L~X* \removals.  One is after the user clicks on the Remove button but before removal begins.  The°dONLNdàX~d* `other is after the removal is finished, but before the user is asked to quit or continue.  A new°dONLNdÈd~p* Yoption allows the Busy Cursor animation to be continued/suspended during execution of the°dONLNdCp~|* ^action atom code resource.  This option is useful when the code resource displays a dialog and°dONLNd¢|~à* [the Busy Cursor is not appropriate.  For installation and removal the order of execution is°dONLNd˛à~îÌ* defined by the ID of the °dONLNdàÌî)o'inaa'°dONLNdàî>)$  resources.
  4952. °dONLNd)¨6¿¯(ª6Action Atom Reference"°∂ ¿4¿0°∂°∂
  4953. °dONLNd?≈~—"+H_This section describes the Action Atom resource format, data structures and function interface.
  4954. °dONLNdüÂ6ıΩ(Ò6Resource Description"°∂ ı4ı0°∂°∂
  4955. °dONLNd¥ˆ~å+H-The format of the Action Atom is shown below.°dONLNd‚ ~®*#define°dONLNdÍ ¥8)6actionAtomFlagsFormat2°dONLNd  
  4956. (
  4957. \°dONLNd¢#ˆ( ¢fill bit[12]; °dONLNd-
  4958. #( 
  4959. \°dONLNd1"¢.Ã(+¢boolean°dONLNd:"Í.b)HcontinueBusyCursors,°dONLNdO"h.‘)~suspendBusyCursors°dONLNdd"
  4960. .)¢\°dONLNdh-¢9Ã(6¢boolean°dONLNdq-Í9b)HactAfter, actBefore;°dONLNdè-
  4961. 9(6
  4962. \°dONLNdì8¢DÃ(A¢boolean°dONLNdú8ÍDò)HdontActOnRemove, actOnRemove;°dONLNd¿8
  4963. D(A
  4964. \°dONLNdƒC¢OÃ(L¢boolean°dONLNdÕCÍO§)HdontActOnInstall, actOnInstall;°dONLNdÌY~eÃ(b~
  4965. type 'inaa' {°dONLNd˝d¢p“+$ switch {°dONLNd    o¥{+
  4966. case format2:°dONLNdzΔÜ&+ key integer = 2;°dONLNd.zVÜ)ê!/* Action Atom Format version. */°dONLNdTÖΔëP(éΔactionAtomFlagsFormat2;°dONLNdlÖVë‡)ê/* Action Atom Flags */°dONLNdàêΔú&(ôΔliteral longint;°dONLNdõêVúÊ)ê/* Code Resource Type */°dONLNd∏õΔ߈(§Δinteger;°dONLNdΔõVß⁄)ê/* Code Resource ID */°dONLNd·¶Δ≤ˆ(ØΔlongint;°dONLNdÔ¶V≤û)ê /* RefCon */°dONLNd    ±ΔΩˆ(∫Δlongint;°dONLNd    ±VΩ)ê!/* Requested Memory (in bytes) */°dONLNd    4ºΔ»,(≈ΔevenPaddedString;°dONLNd    HºV»Ê)ê/* Status Description */°dONLNd    c«¢”Æ(–¢};°dONLNd    f“~fiä(€~};ˇ6dˇ ˇˇˇˇd
  4967. d, Palatino
  4968. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4969.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú58°dONLNdb~m’(j~Flag Descriptions,
  4970. Courier
  4971. °dONLNdp~|b*&continueBusyCursors/suspendBusyCursors°dONLNd:{á+ê ;Controls whether the counting fingers busy cursor should be°dONLNdváì"* =stopped and an arrow cursor shown prior to calling the Action°dONLNd¥ìüè* Atom code resource.  Use the °dONLNd—ìèü˚)ÅsuspendBusyCursors°dONLNd„ì˚ü+)l
  4972.  flag when°dONLNdÓü´(®9you want to display a dialog from within your Action Atom°dONLNd(´∑K* code resource.°dONLNd7ø~À(»~actAfter/ActBefore °dONLNdKøÀ!)ê;Determines whether this Action Atom code resource is called°dONLNdáÀ◊«* )before or after the installation/removal.°dONLNd±fl~Π(Ë~dontActOnRemove/actOnRemove°dONLNdŒÍˆ$+ê =Determines if this Action Atom code resource should be called°dONLNd ˆK*
  4973. on a removal.°dONLNd
  4974. ~,(~dontActOnInstall/actOnInstall°dONLNd9!$+ê =Determines if this Action Atom code resource should be called°dONLNdw!-a* on an installation.
  4975.     °dONLNdã7~B◊(?~Field descriptions
  4976. °dONLNdüE~Q*Code Resource Type °dONLNd≥EQ')êBThe resource type of the code resource, usually ‘infn’.  (4-bytes)°dONLNdˆY~efi(b~Code Resource ID°dONLNdYfie‡)` °dONLNdYe›)00The resource ID of the code resource.  (2-bytes)°dONLNd9m~y¢(v~RefCon°dONLNd?m¢y§)$ °dONLNdAmy,)lAA value to be passed directly to the code resource.  For example,°dONLNdÉyÖ* ;the System 7.X Installer script has all of its Action Atoms°dONLNdøÖë.* Alinked together into one code resource and uses this refCon value°dONLNdëù,* Bas a selector that tells which action atom to run.  By linking all°dONLNdDù©* <action atoms together into one code resource and eliminating°dONLNdÅ©µ* @duplicate code, we cut the size of our action atoms in half.  (4°dONLNd¡©µ#(≤-°dONLNd¬µ¡*(æbytes)°dONLNd……~’fi(“~Requested Memory°dONLNd⁄…’%)ê=The requested number of bytes that should be available in the°dONLNd’·* :Action Atom’s sub-heap when called.  Enter 0 (zero) to not°dONLNdS·Ì!* >create a sub-heap and run inside the Installer’s heap.  Please°dONLNdìÌ˘.* ?see warnings about using sub-heaps in the Atom Extender section°dONLNd”˘Ÿ* /if you specify a value other than 0.  (4-bytes)°dONLNd
  4977. ~Í(~Status Description°dONLNd
  4978. -)ê@An optional string that is displayed in the Status dialog during°dONLNdX%* 9execution of the Action Atom. (even-padded Pascal string)
  4979. °dONLNdì96Iú(E6Data Structures"°∂ I4I0°∂°∂
  4980. °dONLNd£n6|ú*3Function Interface"°∂ |4|0°∂°∂
  4981. °dONLNd∂Å~ç…+HIThe entry point of the Action Atom code resource must have the interface:°dONLNdë~ùfi*ActionAtomResult°dONLNdëÍùŒ)l&ActionAtomFormat2( ActionAtom2PBPtr );°dONLNd8´~∑*(¥~`The Action Atom should return a result telling the Installer what to do after executing the code°dONLNdô∑~√ñ* Bresource.  You can use these constants to specify the result code:°dONLNd‹“~fiÆ*enum {  °dONLNd“¥fiz)6!kActionAtomResultFatalError = -1,ˇËdˇ ˇˇˇˇd
  4982. d, Palatino
  4983. .+~*C  H  A  P  T  E  R      3,     Helvetica
  4984.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú59,
  4985. Courier
  4986. °dONLNdQ¥]h(Z¥kActionAtomResultContinue = 0,°dONLNd"\¥hh* kActionAtomResultCancel = 1 };°dONLNdAr~~2({~typedef long ActionAtomResult;°dONLNd`ï~°@*#,Return results produce the following effect:,
  4987.  
  4988. Zapf Dingbats
  4989.     °dONLNdç´~¥Ö*n
  4990. °dONLNdè©êµ∞)Return °dONLNdñ©∞µF) kActionAtomResultContinue°dONLNdØ©Fµ˚)ñ* if you wish the installation to continue.
  4991.     °dONLNd⁄ø~»Ö(Δ~n
  4992. °dONLNd‹Ωê…∞)Return °dONLNd„Ω∞…:) kActionAtomResultCancel°dONLNd˙Ω:…)ä4 to cancel the installation, just as if the user had°dONLNd/…ê’,(“ê[pressed the Cancel button.  When an action atom returns the cancel message, all action atom°dONLNdã’ê·** _waiting in the queue are not run.  Cancel messages are then sent to all ‘after’ action atoms to°dONLNdηêÌN* )allow them to clean up their environment.
  4993.     °dONLNd˜~Ö(˛~n
  4994. °dONLNdıê∞)Return °dONLNdı∞R) kActionAtomResultFatalError°dONLNd9ıR)¢, to signal that there is something seriously°dONLNdfê
  4995. (
  4996. êWwrong, and the installation should not continue.  When an action atom returns the error°dONLNdæ
  4997. ê** ]message, all action atoms waiting in the queue are not run.  Cancel messages are then sent to°dONLNdê%√* Eall ‘after’ action atoms to allow them to clean up their environment.
  4998. °dONLNdb/l9u(7ls
  4999.     °dONLNdd/~:¡)
  5000. W A R N I N G
  5001. °dONLNdr=~I*\If you choose to create a sub-heap for each invocation of format 2 of the Action Atom please°dONLNdœI~U* Sread the section “Running with a Sub-Heap” within the Atom Extender portion of this°dONLNd#U~a'* `document.  You can enter 0 (zero) in the requested memory field to not create a sub-heap and run°dONLNdÑa~m* inside the Installer’s heap.   
  5002.     °dONLNd£cl)Çs
  5003. °dONLNd•Å6èë(ã6Parameter Block"°∂ è4è0°∂°∂
  5004. °dONLNdµî~†'+H\The Action Atom parameter block contains information about the Installer’s environment.  The°dONLNd†~¨* "parameter block has the structure:°dONLNd5ª~«fi*typedef struct {°dONLNdGΔ꓈+ InstallationStage°dONLNdYΔ¸“>)l fMessageID;°dONLNdf—ꛥ(⁄êHandle°dONLNdp—¸›V)lfStaticDataHdl;°dONLNdÅ‹êË∫(ÂêProcPtr°dONLNd勸Ëb)lfCallBackProcPtr;°dONLNdüÁêÛÆ(êshort°dONLNd©Á¸ÛV)lfTargetVRefNum;°dONLNd∫Úê˛®(˚êlong°dONLNd√Ú¸˛n)lfTargetFolderDirID;°dONLNdÿ˝ê    Æ(êshort°dONLNd‚˝¸    V)lfSystemVRefNum;°dONLNdÛê®(êlong°dONLNd¸¸t)lfSystemBlessedDirID;°dONLNdê®(êlong°dONLNd¸,)lfRefCon;°dONLNd%ê*∫('êBoolean°dONLNd0¸*P)lfDoingInstall;°dONLNd@)ê5∫(2êBoolean°dONLNdK)¸5V)lfDidLiveUpdate;°dONLNd\4ê@®(=êlong°dONLNde4¸@t)lfInstallerTempDirID;°dONLNdz?~K\(H~%}ActionAtom2PBRec, *ActionAtom2PBPtr;
  5005.     °dONLNd†[~fÿ*Field Descriptions
  5006. °dONLNd¥i~u∫*
  5007. fMessageID°dONLNdøiu)ê9One of three messages the Atom Extender will receive when°dONLNd˘uÅ** ?being called. Use these constants to understand the message ID:°dONLNd:âï\*
  5008. enum {before,°dONLNdJî2†V+$ after,°dONLNdSü2´í* cleanUpCancel };°dONLNde≤æ˛(ª(typedef unsigned char InstallationStage;°dONLNdè≈—*<If your Action Atom is running before the installation takes°dONLNd×›>* place, the °dONLNd◊—>›z)0
  5009. fMessageID°dONLNd·—z›ü)<
  5010.  field is °dONLNdΗü›√)%before°dONLNdÒ—√›Δ)$.ˇûdˇ ˇˇˇˇd
  5011. d, Palatino
  5012. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5013.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú60
  5014. °dONLNdQ]'(Z?If your Action Atom is running after the installation completes°dONLNd@]iZ* successfully, the ,
  5015. Courier°dONLNdR]Ziñ)L
  5016. fMessageID°dONLNd\]ñi”)< field will be °dONLNdk]”iÒ)=after°dONLNdp]ÒiÙ).°dONLNdsq}
  5017. (z;If the user clicks the Cancel/Stop button, or the Installer°dONLNdØ}â“* .cancels the installation because of an error, °dONLNd›}“â )ƒ
  5018. cleanUpCancel°dONLNdÎâï(í>messages are sent to all ‘after’ action atoms to allow them to°dONLNd*ï°* 8clean up their environment.  Each ‘after’ action atom is°dONLNdc°≠˜* 4guaranteed to receive only one cancel message if the°dONLNdò≠π* <installation is canceled or stopped.  This may happen before°dONLNd’π≈-* Bthe ‘before’ actions atoms have run, so it’s important to be smart°dONLNd≈—í* within your cleanup routines.°dONLNd6Ÿ~“(‚~fStaticDataHdl°dONLNdEŸÂ)ê7A handle created by the Action Atom using INewHandle to°dONLNd}ÂÒ$* >save information between before and after calls to this Action°dONLNdºÒ˝˜* 1Atom.  The field is always NULL when receiving a °dONLNdÌÒ˜˝)Èbefore°dONLNdÙ˝    (?message.  You can assign a value to this field during the first°dONLNd4    * ;call to the Action Atom, and receive the same value in this°dONLNdp!Ç* field during the next call.°dONLNdå)~5fi(2~fCallBackProcPtr°dONLNdù)5)ê>A pointer to the Installer’s dispatch routine.  You’ll need to°dONLNd‹5A* <pass this field as a parameter to glue routines that provide°dONLNdAMã* access to Installer functions.°dONLNd8U~a“(^~fTargetVRefNum°dONLNdGUa,)ê>The target disk’s vRefNum.  When allowing the user to select a°dONLNdÜam* :target application folder, this is the volume on which the°dONLNd¡myO* folder resides.°dONLNd—Å~çÍ(ä~fTargetFolderDirID°dONLNd‰Åç*)ê@The target application folder’s directory ID.  Target File Specs°dONLNd%çôß* "that use the reserved folder path °dONLNdGçßôÈ)ô folder-user°dONLNdRçÈô,)B will be placed°dONLNdbô•(¢@in this folder.  This value is -1 if the Installer is using disk°dONLNd£•±* ?mode, the folder does not exist, or a File Spec referencing the°dONLNd„±Ωn* reserved folder path °dONLNd¯±nΩ∞)` folder-user°dONLNd±∞Ω')B has not been referenced by°dONLNdΩ…∫(Δ&any atom included in the installation.°dONLNdH—~›“(⁄~fSystemVRefNum°dONLNdW—›)ê:The system disk’s vRefNum.  Target File Specs that use the°dONLNdí›Èn* reserved folder path °dONLNdß›nÈ∞)` special-xxx°dONLNd≤›∞È)B will be placed in the°dONLNd…Èıñ(ÚSystem Folder on this volume.°dONLNdÁ˝~    Í(~fSystemFolderDirID°dONLNd˙˝    )ê:The directory ID of the System Folder on the disk with the°dONLNd5    3* refNum °dONLNd<    3á)%fSystemVRefNum°dONLNdJ    á)T$.  This directory is not necessarily°dONLNdo!Æ(#the currently active System Folder.°dONLNdì)~5®(2~fRefCon°dONLNdõ)5")ê?A 4-byte value defined by the scriptwriter in the ‘inex’ script°dONLNd€5A5*     resource.°dONLNdÂI~UÃ(R~
  5019. fDoingInstall°dONLNdÛIU)ê:TRUE if the user is performing an installation; otherwise,°dONLNd.Uaó* FALSE if the user is removing.°dONLNdMi~u“(r~fDidLiveUpdate°dONLNd\iu)ê:TRUE if the Installer is modifying files inside the active°dONLNdóuÅR* System Folder.°dONLNd¶â~ï(í~fInstallerTempDirID°dONLNd∫âï)ê6The directory ID of the temporary folder on the volume°dONLNdÒï°W* specified in the °dONLNd    ïW°´)IfSystemVRefNum°dONLNd    ï´°-)T field.  The temporary folder°dONLNd    .°≠)(™?holds the files that we are modifying to allow rollback in case°dONLNd    n≠π* >the installation is canceled.  You’ll rarely ever need to look°dONLNd    ≠π≈`* inside this folder.ˇdˇ ˇˇˇˇd
  5020. d, Palatino
  5021. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5022.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú61
  5023. °dONLNdQ6e
  5024. (`6Using Audit Atoms (‘inat’)"°∂ e4e0°∂°∂
  5025. °dONLNdj~v+HWDuring the development of System Software scripts, there were many times we wished that°dONLNdsv~Ç    * Wthere was a history of what had previously been installed.  For example, the user did a°dONLNdÀÇ~é* Uminimal SE System Software installation, and later wanted to add minimal Macintosh II°dONLNd!é~ö* YSystem Software.  During the second installation, the Installer should be smart enough to°dONLNd{ö~¶'* ]update the disk with both SE and II software.  Installer Audit Atoms were added to facilitate°dONLNdŸ¶~≤i* 4this type of updating.  Their format is shown below.°dONLNd∫~Δ'*`When the Installer finds an Audit Atom in a script, after an installation is complete, it adds a°dONLNdoΔ~“”* new resource (type ,
  5026. Courier°dONLNdÇΔ”“˜)U'audt'°dONLNdàΔ˜“ )$@) to the target file specified in the Audit Atom.  This resource°dONLNd…“~fin(€~8contains an array of audit selector/value pairs.  If an °dONLNd“nfií)'audt'°dONLNd“ífi)$ resource already exists in the°dONLNd'fi~Í(Á~atarget file and there is no entry for the given selector, an entry is added.  If an entry for the°dONLNdâÍ~ˆ* Yselector already exists, the higher of the two values is used.  Using the Installer Rules°dONLNd„ˆ~fi* checkAuditRecord°dONLNdÛˆfiÛ)` and °dONLNd¯ˆÛe)checkAnyAuditRecord°dONLNd ˆe)r(, later installations can make decisions°dONLNd4~‡( ~based on this history.
  5027. °dONLNdK&6:(56Audit Atom Reference
  5028. °dONLNd`K6[Ω*"Resource Description"°∂ :4:0°∂°∂"°∂ [4[0°∂°∂
  5029. °dONLNdu`~l+H Format 0 of the ‘inat’ resource:°dONLNdñp~|Ã*
  5030. type 'inat' {°dONLNd•{êá¿+ switch {°dONLNd∞Ü¢í+
  5031. case format0:°dONLNd¡ë¥ù+ key integer = 0;°dONLNd÷úΔ®+ FileSpecID;°dONLNd‰ú2®‡)l/* Target File Spec Rsrc ID*/°dONLNdßΔ≥(∞ΔOSType;°dONLNdß2≥™)l/* Audit Selector */°dONLNd*≤Δæ&(ªΔliteral longint;°dONLNd;≤2æò)l/* Audit Value */°dONLNdPΩ¥…¿(Δ¥};°dONLNdS»~‘ä(—~};
  5032.     °dONLNdV‰~Ô◊*Field descriptions
  5033. °dONLNdiÚ~˛*Target File Spec. Rsrc ID°dONLNdÇÚ˛)ñ °dONLNdÖ˝    +(?The resource ID of a Target File Spec. of which you want to add°dONLNd≈    * <or update the audit resource.  Apple uses the System File to°dONLNd!%* =keep a history of System Software that has been installed.  A°dONLNd@!->* File Spec (°dONLNdK!>-b)0'intf'°dONLNdQ!b-")$- resource) must exist in the script with this°dONLNd-9J(6ID.  (2-bytes)°dONLNdéA~M“(J~Audit Selector°dONLNdúA“M‘)T °dONLNdûAMí)<A meaningful type.  (4-bytes)°dONLNdºU~a¿(^~ Audit Value°dONLNd«U¿a¬)B °dONLNd…Uaó)NA meaningful value.  (4-bytes)
  5034. °dONLNdËy6ç?(à6Using Boot Block Atoms (‘inbb’)"°∂ ç4ç0°∂°∂
  5035. °dONLNdí~û!+H]Boot Block Atoms are used to write or change the parameters in a target volume’s boot blocks.°dONLNdgû~™** _Boot Block Atoms are different from file and resource atoms – they can indicate something to be°dONLNd«™~∂π* Ecopied, or indicate an individual parameter that needs to be changed.°dONLNd
  5036. æ~  *^To cause boot blocks to be written to a target volume, include a Boot Block Atom with a key of°dONLNdl ~÷ï* type °dONLNdq ï÷—)
  5037. 'bbUpdate'°dONLNd{ —÷+)<M.  The argument to this type of Boot Block Atom is an integer which indicatesˇ
  5038. Údˇ ˇˇˇˇd
  5039. d, Palatino
  5040. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5041.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú62
  5042. °dONLNdQ~]
  5043. (Z~\the ID of a File Spec in the script.  The file indicated by this File Spec should contain a ,
  5044. Courier°dONLNd\Q
  5045. ].(Z
  5046. 'boot'°dONLNdc]~i˛(f~Zresource.  A copy of the resource is written to the first two blocks of the target volume.
  5047. °dONLNdæÅ6ï(ê6Boot Block Atom Reference
  5048. °dONLNdÿ¶6∂Ω*"Resource Description"°∂ ï4ï0°∂°∂"°∂ ∂4∂0°∂°∂
  5049. °dONLNd̪~«+H Format 0 of the ‘inbb’ resource:°dONLNdÀ~◊®*#define°dONLNdÀ¥◊ )6BootBlockAtomFlags°dONLNd2À‘◊⁄(‘‘\°dONLNd5÷ê‚fi(flê
  5050. fill bit[14];°dONLNdP÷‘‚⁄(fl‘\°dONLNdT·¢ÌÃ(Í¢boolean°dONLNd\·ÿÌ∂)6%dontChangeOnInstall, changeOnInstall;°dONLNdÉ·‘Ì⁄)¸\°dONLNdáÏ¢¯Ã(ı¢boolean°dONLNdèÏÿ¯™)6#dontChangeOnRemove, changeOnRemove;°dONLNd≥~®( ~#define°dONLNdª¥,)6BootBlockUpdateFlags°dONLNdŸ‘⁄( ‘\°dONLNd›
  5051. ¢Í(¢ fill bit[7];°dONLNdˆ
  5052. ‘⁄(‘\°dONLNd˙¢$Ã(!¢boolean°dONLNdÿ$û)6!replaceBBSysName, saveBBSysName; °dONLNd&‘$⁄)¸\°dONLNd*#¢/Ã(,¢boolean°dONLNd2#ÿ/™)6#replaceBBShellName, saveBBShellName°dONLNdX#‘/⁄)¸\°dONLNd\.¢:Ã(7¢boolean°dONLNdd.ÿ:§)6"replaceBBDbg1Name, saveBBDbg1Name;°dONLNdâ.‘:⁄)¸\°dONLNdç9¢EÃ(B¢boolean°dONLNdï9ÿE™)6#replaceBBDbg2Name, saveBBDbg2Name; °dONLNdª9‘E⁄)¸\°dONLNdøD¢PÃ(M¢boolean°dONLNd«DÿPº)6&replaceBBScreenName, saveBBScreenName;°dONLNdÔD‘P⁄)¸\°dONLNdÛO¢[Ã(X¢boolean°dONLNd˚Oÿ[∂)6%replaceBBHelloName, saveBBHelloName; °dONLNd"O‘[⁄)¸\°dONLNd&Z¢fÃ(c¢boolean°dONLNd.Zÿf∞)6$replaceBBScrapName, saveBBScrapName;°dONLNdTZ‘f⁄)¸\°dONLNdXe¢qÃ(n¢boolean°dONLNd`eÿqò)6 replaceBBCntFCBs, maxBBCntFCBs; °dONLNdÑe‘q⁄)¸\°dONLNdàp¢|Ã(y¢boolean°dONLNdêpÿ|å)6replacebbCntEvts, maxBBCntEvts°dONLNd≤p‘|⁄)¸\°dONLNd¥Ü~íÃ(è~
  5053. type 'inbb' {°dONLNd√ëêù¿+ switch {°dONLNdŒú¢®+
  5054. case format0:°dONLNdflߥ≥+ key integer = 0;°dONLNdÛ≤¥æ&* BootBlockAtomFlags;°dONLNd ΩΔ…ˆ+ switch {°dONLNd»ÿ‘,+ case bbUpdate:°dONLNd.”ÍflP+ key integer = -1;°dONLNdGfiÍÍ* RsrcID;°dONLNdVÈÍıh* BootBlockUpdateFlags;°dONLNdxˇÿ (ÿ
  5055. case bbID:°dONLNdâ
  5056. ÍJ+ key integer = 1;°dONLNd†Í!J* decimal integer;°dONLNdº+ÿ7&(4ÿ
  5057. case bbEntry:°dONLNd–6ÍBJ+ key integer = 2;°dONLNdÁAÍMJ* decimal longint;°dONLNdWÿc2(`ÿcase bbVersion:°dONLNdbÍnJ+ key integer = 3;°dONLNd1mÍyJ* decimal integer;°dONLNdNÉÿè>(åÿcase bbPageFlags:°dONLNdféÍöJ+ key integer = 4;°dONLNd}ôÍ•J* decimal integer;°dONLNdöØÿª2(∏ÿcase bbSysName:°dONLNd∞∫ÍΔJ+ key integer = 5;°dONLNd«≈Í—P* EvenPaddedString;ˇ    dˇ ˇˇˇˇd
  5058. d, Palatino
  5059. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5060.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú63,
  5061. Courier
  5062. °dONLNdQÿ]>(Zÿcase bbShellName:°dONLNd\ÍhJ+ key integer = 6;°dONLNd/gÍsP* EvenPaddedString;°dONLNdM}ÿâ8(Üÿcase bbDbg1Name:°dONLNddàÍîJ+ key integer = 7;°dONLNd{ìÍüP* EvenPaddedString;°dONLNdô©ÿµ8(≤ÿcase bbDbg2Name:°dONLNd∞¥Í¿J+ key integer = 8;°dONLNd«øÍÀP* EvenPaddedString;°dONLNdÂ’ÿ·D(fiÿcase bbScreenName:°dONLNd˛‡ÍÏJ+ key integer = 9;°dONLNdÎ͘P* EvenPaddedString;°dONLNd3ÿ
  5063. >(
  5064. ÿcase bbHelloName:°dONLNdK ÍP+ key integer = 10;°dONLNdcÍ#P* EvenPaddedString;°dONLNdÅ-ÿ9>(6ÿcase bbScrapName:°dONLNdô8ÍDP+ key integer = 11;°dONLNd±CÍOP* EvenPaddedString;°dONLNdœYÿe2(bÿcase bbCntFCBs:°dONLNdÂdÍpP+ key integer = 12;°dONLNd˝oÍ{J* decimal integer;°dONLNdÖÿë2(éÿcase bbCntEvts:°dONLNd0êÍúP+ key integer = 13;°dONLNdHõÍßJ* decimal integer;°dONLNde±ÿΩ>(∫ÿcase bb128KSHeap:°dONLNd}ºÍ»P+ key integer = 14;°dONLNdï«Í”J* decimal longint;°dONLNd≤›ÿÈ>(Êÿcase bb256KSHeap:°dONLNd ËÍÙP+ key integer = 15;°dONLNd‚Û͡J* decimal longint;°dONLNdˇ    ÿ>(ÿcase bb512KSHeap:°dONLNdÍ P+ key integer = 16;°dONLNd/Í+J* decimal longint;°dONLNdL5ÿAJ(>ÿcase bbSysHeapSize:°dONLNdf@ÍLP+ key integer = 16;°dONLNd~KÍWJ* decimal longint;°dONLNdõaÿmP(jÿcase bbSysHeapExtra:°dONLNd∂lÍxP+ key integer = 18;°dONLNdŒwÍÉJ* decimal longint;°dONLNdÎçÿôP(ñÿcase bbSysHeapFract:°dONLNdòͧP+ key integer = 19;°dONLNd£ÍØJ* decimal longint;°dONLNd3ÆΔ∫“(∑Δ};°dONLNd:πΔ≈,* EvenPaddedString;°dONLNdNπV≈)ê!/* Boot Block Atom Description */°dONLNdrƒ¢–Æ(Õ¢};°dONLNduœ~€ä(ÿ~};ˇ≤dˇ ˇˇˇˇd
  5065. d, Palatino
  5066. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5067.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú64°dONLNdb~m⁄(j~Flags descriptions,
  5068. Courier
  5069. °dONLNdp~|P*#dontChangeOnInstall/changeOnInstall°dONLNd6pP|R)“ °dONLNd9{á(Ñ8Determine if the boot blocks should be updated during an°dONLNdráìu* installation.  (2-bytes)°dONLNdãõ~ßD(§~!dontChangeOnRemove/changeOnRemove°dONLNd¨õDßF)Δ °dONLNdض≤™(Ø#Not currently supported.  (2-bytes)
  5070.     °dONLNd”º~«◊(ƒ~Field descriptions
  5071. °dONLNdÊ ~÷ˆ*Boot Block Value Key°dONLNd˙ ˆ÷¯)x °dONLNd¸ ÷')>Specifies which boot block parameter is being given a value in°dONLNd;÷‚ * =the Boot Block Value field.  The key can correspond to any of°dONLNdy‚Ó* ;the parameters which are changeable in the boot blocks.  (2°dONLNd¥‚Ó(Î-°dONLNdµÓ˙*(˜bytes)°dONLNdΩfl*0The possible keys for this field are as follows:°dONLNdÓ~"Æ(~bbUpdate°dONLNd˜"ê)êCopy over boot blocks from a °dONLNdê"¥)Ç'boot'°dONLNd¥"%)$ resource found in the file°dONLNd6".)(+@whose File Spec ID is given in the 2-byte value field.  A second°dONLNdw.:* =2-byte value field is used for this type of Boot Block Value.°dONLNd∂:F* ;This second value field is used to specify which boot block°dONLNdÚFR§* "fields are to be updated from the °dONLNdF§R»)ñ'boot'°dONLNdF»R$)$ resource, and which°dONLNd/R^!([Aones are to be preserved on the target disk.  If bits 0 through 6°dONLNdq^j* :are set, the appropriate value on the target is kept if it°dONLNd¨jv* Cappears to be a legal value or string.  If bits 7 or 8 are set, the°dONLNdvÇ$* :maximum parameter from the resource or what already exists°dONLNd+Çé
  5072. * ;on the target is preserved.  The format of this field is as°dONLNdgéö3* follows:°dONLNdp¢~Æñ(´~bbID°dONLNdu¢Æ)ê8The Boot Block Value field updates the boot blocks ID (2°dONLNd≠¢Æ(´-°dONLNdÆÆ∫-(∑bytes).°dONLNd∂¬~Œ®(À~bbEntry°dONLNd欌)ê7The value updates the boot block entry point (4-bytes).°dONLNdˆ÷~‚¥(fl~    bbVersion°dONLNd÷‚Ù)ê3The value updates the boot block version (2-bytes).°dONLNd4Í~ˆ¿(Û~ bbPageFlags°dONLNd@͈ı)ê3The value updates the page 2 usage flags (2-bytes).°dONLNdt˛~
  5073. ¥(~    bbSysName°dONLNd~˛
  5074. ,)ê@The value updates the name of the system resource file (string).°dONLNdø~¿(~ bbShellName°dONLNdÀ
  5075. )ê8The value updates the name of the system shell (string).°dONLNd&~2∫(/~
  5076. bbDbg1Name°dONLNd&2)ê<The value updates the first loaded debugger’s name (string).°dONLNdL:~F∫(C~
  5077. bbDbg2Name°dONLNdW:F')ê=The value updates the second loaded debugger’s name (string).°dONLNdïN~ZΔ(W~ bbScreenName°dONLNd¢NZ%)ê?The value updates the file name of the startup screen (string).°dONLNd‚b~n¿(k~ bbHelloName°dONLNdÓbn    )ê6The value updates the file name of the startup program°dONLNd%nz3*     (string).°dONLNd/Ç~é¿(ã~ bbScrapName°dONLNd;Çé )ê8The value updates the file name of the system scrap file°dONLNdtéö3*     (string).°dONLNd~¢~Æ¥(´~    bbCntFCBs°dONLNdà¢Æ )ê7The value updates the number of FCBs to open (2-bytes).°dONLNd¿∂~¬¥(ø~    bbCntEvts°dONLNd ∂¬    )ê8The value updates the size of the event queue (2-bytes).°dONLNd ~÷¿(”~ bb128KSHeap°dONLNd ÷∏)ê(This boot block field is no longer used.ˇdˇ ˇˇˇˇd
  5078. d, Palatino
  5079. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5080.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú65,
  5081. Courier
  5082. °dONLNdQ~]¿(Z~ bb256KSHeap°dONLNd Q]∏)ê(This boot block field is no longer used.°dONLNd5e~q¿(n~ bb512KSHeap°dONLNdAeq")ê;The value updates the size of the system heap on a 512K Mac°dONLNd}q}:*
  5083. (4-bytes).°dONLNdàÖ~ëÃ(é~
  5084. bbSysHeapSize°dONLNdñÖë)ê9The value updates the absolute size of the system heap (4°dONLNdœÖë(é-°dONLNd–ëù-(öbytes).°dONLNdÿ•~±“(Æ~bbSysHeapExtra°dONLNdÁ•±∏)ê(This boot block field is no longer used.°dONLNdπ~≈“(¬~bbSysHeapFract°dONLNdπ≈')ê:The value updates the minimal additional system heap space°dONLNdZ≈—b* required (4-bytes).°dONLNdoŸÂ,*=Note: Under System 7.0 and greater, the system heap space and°dONLNd≠ÂÒ.* =the number of FCBs to open are dynamically determined and not°dONLNdÎÒ˝©* #controlled by the boot block value.°dONLNd~fi(~Boot Block Value°dONLNdfi‡)` °dONLNd! )0<The value for the boot block parameter that was specified in°dONLNd^
  5085. * ;the boot block value key.  It has a size as given above (in°dONLNdö)Û* 3parentheses).  (size depends on the type of update)
  5086. °dONLNdŒA6U/(P6About Atom Extenders (‘inex’)"°∂ U4U0°∂°∂
  5087. °dONLNdÏZ~f%+H\Scriptwriters can use Atom Extenders to enhance or replace the default copy mechanism of the°dONLNdIf~rÛ* SInstaller.  The most obvious purpose of the Atom Extender is to provide transparent°dONLNdùr~~
  5088. * Zdecompression of files during installation.  Scriptwriters presently using Action Atoms to°dONLNd¯~~ä'* \perform decompression, either written by themselves or a third-party developer, will want to°dONLNdUä~ñ[* 2use Atom Extenders for this purpose in the future.°dONLNdàû~™)*]If you want to write an Atom Extender then read the section “Writing Atom Extenders” to learn°dONLNdÊ™~∂* Zhow.  If you only want to take advantage of an Atom Extender someone else has written then°dONLNdA∂~¬‘* Kconsult the sections describing the File Atom, Resource Atom and Font Atom.
  5089. °dONLNdç⁄6Ó(È6Writing Atom Extenders"°∂ Ó4Ó0°∂°∂
  5090. °dONLNd§Û~ˇ"+H^An Atom Extender is a newly-defined script resource of type ‘inex’ that can be referenced from°dONLNdˇ~ * Wnew versions of the File Atom, Resource Atom, and Font Atoms.  At the heart of the Atom°dONLNd[ ~'* _Extender is a code resource (provided by the scriptwriter) that contains the necessary 68K code°dONLNdª~#q* 8to be executed at the desired point in the installation.°dONLNdı+~7µ*FThis section describes the necessary steps to create an Atom Extender.
  5091. °dONLNd<K~ZQ*""Creating an ‘inex’ Script Resource"°∂ Y|Y0°∂°∂
  5092. °dONLNd_^~j&*`The new ‘inex’ script resource contains the necessary information to properly call the specified°dONLNd¿j~vª* code resource.
  5093.     °dONLNd—~~âœ*Code Listing 3-1°dONLNd‚~Íâ^)lSample ‘inex’ script resource
  5094. °dONLNdà~î(ë~resource 'inex' (129) {°dONLNdìêüΔ+     format0 {°dONLNd%û¢™+ dontSendInitMessage,°dONLNd;û2™
  5095. )ê$/* Don’t send kInitialize message */°dONLNdb©¢µ(≤¢sendBeforeMessage,°dONLNdv©2µÊ)ê/* Send kBeforePart message */°dONLNd󥢿 (Ω¢dontSendAfterMessage,°dONLNd≠¥2¿)ê#/* Don’t send kAfterPart message */°dONLNd”ø¢À,(»¢dontSendSuccessMessage,°dONLNdÎø2À¯)ê!/* Don’t send kSuccess message */°dONLNd     ¢÷&(”¢dontSendCancelMessage,°dONLNd    & 2÷Ú)ê /* Don’t send kCancel message */°dONLNd    I’¢·(fi¢continueBusyCursors,°dONLNd    _’2·˛)ê"/* Show busy cursor during call */ˇ¥dˇ ˇˇˇˇd
  5096. d, Palatino
  5097. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5098.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú66,
  5099. Courier
  5100. °dONLNdQ¢]Ã(Z¢'infn',°dONLNd
  5101. Q2]
  5102. )ê$/* Resource type of code resource */°dONLNd4\¢h∫(e¢128,°dONLNd?\2h˛)ê"/* Resource ID of code resource */°dONLNddg¢s∫(p¢100,°dONLNdog2s‘)ê/* RefCon (long integer) */°dONLNdçr¢~Δ({¢30720,°dONLNdôr2~.)ê*/* 30K of requested free memory in heap */°dONLNdΔ}¢â(Ü¢"This is a test."°dONLNd⁄}2â
  5103. )ê$/* Status description during call */°dONLNdàêîñ(ëê}°dONLNdì~üä(ú~};°dONLNd¢~Ær*7The sample ‘inex’ resource in Code Listing 3-1 asks the
  5104.     °dONLNd<£rÆu)Ù 
  5105. °dONLNd=¢uÆ#)(Installer to call the code resource with°dONLNdfÆ~∫)(∑~_the type ‘infn’ and ID = 128 before the Installer begins copying the atom’s data from which the°dONLNdΔ∫~Δ,* ^Atom Extender is referenced.  When the code resource is called it will have a maximum of 30720°dONLNd%Δ~“* Tbytes of free memory in its own heap, from which it can allocate memory using Memory°dONLNdz“~fiÛ* Manager routines, such as °dONLNdî“Ûfi)uNewPtr°dONLNdö“fi,)$ and °dONLNdü“,fib)    NewHandle°dONLNd®“bfi))6-.  You must check the actual size of the heap°dONLNd÷fi~Í+(Á~aat the beginning of your code resource to make sure you were allocated the full amount, since the°dONLNd8Í~ˆ$* `Installer calls you whether or not your requested was fully granted.  This error will usually be°dONLNdôˆ~
  5106. * [an idication that the Installer’s memory partition is set too low.  The actual heap size is°dONLNdı~* Zusually 5K larger than the requested size, but you should never depend on this being true.
  5107.     °dONLNdP~#ö*NOTE
  5108. °dONLNdU&~2’*LAtom Extenders are only called during installations, never during removals. ,
  5109.  
  5110. Zapf Dingbats
  5111.     °dONLNd°(’1‹(/’u
  5112. °dONLNd£F~UC(Q~Writing a Simple Atom Extender"°∂ T|T0°∂°∂
  5113. °dONLNd¬Y~e*]A very simple task for an Atom Extender is to simulate the default copy task of the Installer°dONLNd e~q* ]using the supplied Installer routines.  In Code Listing 3-2 the function reads and writes the°dONLNd~q~}1* )atom’s data using the Installer routines °dONLNdßq1}Ö)≥ReadSourceData°dONLNdµqÖ}ö)T and °dONLNd∫qö}Ù)WriteTargetData°dONLNd…qÙ}˜)Z.
  5114.     °dONLNdÀÖ~êœ(ç~Code Listing 3-2°dONLNd‹ÖÍê)l@Simple Atom Extender performing a direct copy of an atom’s data.
  5115. °dONLNdè6õ(ò6&ExtenderResultCode main( ExtenderPBPtr°dONLNdEè2õå)¸extenderPBPtr )°dONLNdUö6¶<(£6{°dONLNdX•H±f+ OSErr°dONLNdc•Δ±)~theErr;°dONLNdl∞Hº`(πHlong°dONLNdv∞Δºˆ)~dataLen;°dONLNdĪH«Z(ƒHPtr°dONLNdâªΔ«)~
  5116. theBufferPtr;°dONLNdòΔH“¥(œHExtenderResultCode°dONLNd´ΔΔ“)~ resultCode;°dONLNd∏‹HË8(ÂH(// -- Initalize some important variables°dONLNd‚ÁHÛ®* dataLen = 30000;°dONLNdÙÚH˛¢* theErr = noErr;°dONLNdHí*7// -- Depending on the message, perform the proper task°dONLNd>HÚ* Gswitch( extenderPBPtr->fFileCopyPBRec.fEnvironmentHeader.fMessageID ) {°dONLNdà)Z5¿+case kBeforePart:°dONLNd†?lKÍ+// -- Create a buffer°dONLNdπJlV&* theBufferPtr = NewPtr(dataLen);°dONLNdfl`llÜ*/// -- Check that we got our buffer successfully°dONLNdklwí* 1if( theBufferPtr != NULL && MemErr() == noErr ) {°dONLNdKÅ~ç⁄+:// -- Read as much as we can up to the size of the buffer.°dONLNdäå~ò§* 1theErr = ReadSourceData( &dataLen, theBufferPtr);°dONLNd¿¢~ÆÜ*,// -- Loop while there is more data to read.°dONLNdÚ≠~π* while( dataLen > 0 ) {°dONLNd    Œê⁄+!B// -- This is where we can massage the data before writing it out.ˇ.dˇ ˇˇˇˇd
  5117. d, Palatino
  5118. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5119.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú67,
  5120. Courier
  5121. °dONLNdQê]ú(Zê//°dONLNdQ¥]
  5122. )$9For example, if the source files were compressed, this is°dONLNdD\êhú(eê//°dONLNdH\¥h»)$.where we might call our decompression routine.°dONLNd|}êâ&(Üê// -- Write the data out.°dONLNdõàêî∂* 1theErr = WriteTargetData( dataLen, theBufferPtr);°dONLNd“ûê™Ï*:// -- Read as much as we can up to the size of the buffer.°dONLNd©êµ* if( theErr == noErr ) {°dONLNd0¥¢¿»+ 1theErr = ReadSourceData( &dataLen, theBufferPtr);°dONLNdo ¢÷¬*0// -- If we got eofErr, then we know we're done,°dONLNd¶’¢·Æ* //°dONLNd™’Δ·z)$ and dataLen will be 0 (zero).°dONLNdœ‡¢Ï&(È¢if( theErr == eofErr )°dONLNdÌÎ¥˜+ theErr = noErr;°dONLNdˆêñ(ˇê}°dONLNd ~ä(~} °dONLNd ä ) // while not done copying°dONLNd."~.¸(+~if( theErr == noErr )°dONLNdI-ê9&+ resultCode = kCopiedData;°dONLNdg8~Dñ(A~else°dONLNdqCêO&+ resultCode = kFatalError;°dONLNdèY~e(b~// -- Dispose the buffer°dONLNd¨d~p* DisposPtr(theBufferPtr);°dONLNd»ol{r(xl}°dONLNdÕzlÜÑ* else°dONLNd÷Ö~ë+ resultCode = kFatalError;°dONLNdÛõlßê(§lbreak;°dONLNd˛±ZΩò(∫Z5// -- For this example, we ignore the other messages.°dONLNd6ºZ»¿* case kInitialize:°dONLNdJ«Z”∫* case kAfterPart:°dONLNd^“ZfiÆ* case kSuccess:°dONLNdp›ZÈ®*
  5123. case kCancel:°dONLNdÅËlÙ&+ resultCode = kContinueAsNormal;°dONLNd§Ûlˇê* break;°dONLNd¨˛H
  5124. N(H}°dONLNd±H ¥*return resultCode;°dONLNdƒ6+<((6}°dONLNdΔ.~:+H_Once the code in Code Listing 3-2 has been compiled into a code resource, it can be called from°dONLNd&:~F$* ]any atom and will copy the atom’s data as if the Installer had performed the copy.  This also°dONLNdÑF~R* ]works for atoms whose source pieces have been split across multiple source disks, because the°dONLNd‚R~^
  5125. * [Installer keeps track of where each source piece should be written in the target file.  The°dONLNd>^~j¡* HInstaller data routines are similar to high-level File Manager routines:,
  5126.  
  5127. Zapf Dingbats
  5128.     °dONLNdát~}Ö*n
  5129. °dONLNdârê~‰)ReadSourceData°dONLNdór‰~#)T — Similar to °dONLNd•r#~G)?FSRead°dONLNd´rG~J)$.
  5130.     °dONLNd≠à~ëÖ(è~n
  5131. °dONLNdØÜêíÍ)WriteTargetData°dONLNdæÜÍí))Z — Similar to °dONLNdÃÜ)íS)?FSWrite°dONLNd”ÜSíV)*.
  5132.     °dONLNd’ú~•Ö(£~n
  5133. °dONLNd◊öê¶)SetTargetDataPos°dONLNdÁö¶)` and °dONLNdÏö¶e)SetSourceDataPos°dONLNd¸öe¶§)` — Similar to °dONLNd
  5134. ö§¶‘)?SetFPos.
  5135.     °dONLNd∞~πÖ(∑~n
  5136. °dONLNdÆê∫)GetTargetDataPos°dONLNd%Æ∫)` and °dONLNd*Æ∫e)GetSourceDataPos°dONLNd:Æe∫§)` — Similar to °dONLNdHƧ∫Œ)?GetFPos°dONLNdOÆŒ∫—)*.
  5137.     °dONLNdQƒ~ÕÖ(À~n
  5138. °dONLNdS¬êŒ)GetTargetDataEOF°dONLNdc¬Œ)` and °dONLNdh¬Œe)GetSourceDataEOF°dONLNdx¬eŒ§)` — Similar to °dONLNdܬ§ŒŒ)?GetEOF.ˇ`dˇ ˇˇˇˇd
  5139. d, Palatino
  5140. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5141.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú68
  5142. °dONLNdQ~](Z~\One of five messages can be sent to the Atom Extender.  Flags in the ‘inex’ resource specify°dONLNd]]~i$* Ywhich messages the Atom Extender wishes to receive.  The Atom Extender writer can examine°dONLNd∑i~uê* the ,
  5143. Courier°dONLNdªiêuÃ)
  5144. fMessageID°dONLNd≈iÃu&)<L field in the parameter block to determine which message has been sent.  The°dONLNdu~Å-(~~%following messages have been defined:,
  5145.  
  5146. Zapf Dingbats
  5147.     °dONLNd8ã~îÖ*n
  5148. °dONLNd:âêï“) kInitialize°dONLNdEâ“ï)BE — Sent after the user clicks the Install button and preflighting has°dONLNdãïê°˘(ûêsuccessfully completed.
  5149.     °dONLNd£´~¥Ö(≤~n
  5150. °dONLNd•©êµÿ) kBeforePart °dONLNd±©ÿµ')HL— Sent after the Installer has opened the atom’s source file and is about to°dONLNd˛µê¡Ú(æêcopy the atom’s data.
  5151.     °dONLNdÀ~‘Ö(“~n
  5152. °dONLNd…ê’“) kAfterPart °dONLNd!…“’ÿ)B:— Sent after the atom’s data has been successfully copied.
  5153.     °dONLNd\fl~ËÖ(Ê~n
  5154. °dONLNd^›êÈ¿)kSuccess°dONLNdf›¿È·)0A — Sent after the entire installation has successfully completed.
  5155.     °dONLNd®Û~¸Ö(˙~n
  5156. °dONLNd™Òê˝¿)kCancel °dONLNd≤Ò¿˝)0N— Sent after an installation was stopped due to an error or cancelation by the°dONLNd˝ê    3(ê#user, Action Atom or Atom Extender.°dONLNd%~(~\The Atom Extender must return a result telling the Installer what to do after receiving each°dONLNdÇ~)˜* message.  The result codes, °dONLNdû˜)9)y kFatalError°dONLNd©9)>)B, °dONLNd´>)§)kContinueAsNormal°dONLNdº§)©)f, °dONLNdæ©))kCancelInstallation°dONLNd—),)r can°dONLNd÷)~5(2~_be returned for any message.  If you do not want to change the default action of the Installer,°dONLNd65~Aõ* return °dONLNd=5õA)kContinueAsNormal°dONLNdN5Ab)f; otherwise, return kF°dONLNdd5bAò)a    atalError°dONLNdm5òA•)6 or °dONLNdq5•A)
  5157. kCancelInstallation°dONLNdÑ5A")r to°dONLNdàA~M:(J~+stop the installation.  If the message was °dONLNd≥A:M|)º kBeforePart°dONLNdæA|M )B$ and you’ve copied the data yourself°dONLNd„M~Yë(V~>(with or without the supplied Installer routines) then return °dONLNd!MëY”(Vë kCopiedData°dONLNd,M”Y÷)B.
  5158. °dONLNd.m~|Ä(x~'Memory Allocation within Atom Extenders"°∂ {|{0°∂°∂
  5159. °dONLNdVÄ~å$*XWhen the Atom Extender is executed, memory allocated using Macintosh OS/Toolbox routines°dONLNdØå~ò%* ^will come from a sub-heap created by the Installer.  The size of the sub-heap is determined by°dONLNdò~§** athe requested free memory field of the ‘inex’ resource, and the available room in the Installer’s°dONLNdp§~∞* \heap.  You must check the actual size of the heap to make sure you were allocated all of the°dONLNdÕ∞~º* Wmemory you requested, since the Installer calls you whether or not all your request was°dONLNd%º~»* Xallocated.  This helps the Installer maintain better control over all memory allocation.°dONLNd~–~‹*]The scriptwriter may need to adjust the size of the Installer’s partition to make sure enough°dONLNd‹‹~Ë* Wmemory is always available for the Atom Extender’s needs.  The following equation helps°dONLNd4Ë~Ù* Xdetermine the Installer’s partition size for the required free memory and other factors.°dONLNdé¸ê+VrunTimeSize = size of the largest:  ‘FOND’ resource, Desk Accessory resource, or owned°dONLNdÂêÒ* resource being copied.°dONLNd˛ê("*XextenderSize = largest required free memory of any Atom Extender + code size of all Atom°dONLNd    W(ê4* XExtenders,  in use during an installation + the total amount of static memory allocated.°dONLNd    ±<êHd*0scriptSize = the uncompressed size of the script°dONLNd    „Pê\ *Yestimated partition size = (the larger of: runTimeSize, extenderSize) + scriptSize + 350K°dONLNd
  5160. =d~p(m~[Installer 4.0 provides memory management routines of its own to allow Atom Extenders to use°dONLNd
  5161. ôp~|$* [available memory from the MultiFinder and Installer heaps.  These routines are very similar°dONLNd
  5162. ı|~à¸* Rto the Memory Manager calls, but are needed to maintain compatibility with pre-7.0°dONLNd Hà~î)* #MultiFinder temporary memory calls.
  5163.     °dONLNd lû~ßÖ*n
  5164. °dONLNd núê®Ã)
  5165. INewHandle°dONLNd xúî )< — Similar to °dONLNd Üú ®A)?    NewHandle°dONLNd èúA®ä)6, but always use °dONLNd †úä®ÿ)I
  5166. IDisposHandle°dONLNd ≠úÿ®)N to dispose this°dONLNd æ®ê¥…(±ê handle, and °dONLNd  ®…¥Ì)9IHLock°dONLNd –®Ì¥)$ and°dONLNd ‘®¥6)     IHUnlock°dONLNd ›®6¥)63 to lock and unlock this handle.  The handle may or°dONLNd ¥ê¿Ü(Ωê4may not have been allocated in the MultiFinder heap.
  5167.     °dONLNd F ~”Ö(—~n
  5168. °dONLNd H»ê‘‰)IDisposHandle °dONLNd V»‰‘!)T
  5169. — Similar to °dONLNd c»!‘i)= DisposHandle°dONLNd o»i‘l)H.ˇ^dˇ ˇˇˇˇd
  5170. d, Palatino
  5171. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5172.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú69,
  5173.  
  5174. Zapf Dingbats
  5175. °dONLNdS~\Ö(Z~n,
  5176. Courier
  5177. °dONLNdQê]¥)IHLock°dONLNdQ¥]Û)$ — Similar to °dONLNdQÛ])?HLock°dONLNdQ]).
  5178.     °dONLNdg~pÖ(n~n
  5179. °dONLNdeêqΔ)    IHUnlock °dONLNd(eΔq)6
  5180. — Similar to °dONLNd5eq-)=HUnlock°dONLNd<e-q0)*.°dONLNd>y~Öí(Ç~The °dONLNdByíÖŒ)
  5181. INewHandle°dONLNdLyŒÖ)<J routine has been provided for two main purposes.  The first purpose is to°dONLNdóÖ~ë!(é~Zallow access to extra memory, when available, to make the actions of an Atom Extender more°dONLNdÚë~ù'* ^efficient.  The second purpose is to allow memory to be maintained over invocations of an Atom°dONLNdQù~©©*     Extender.
  5182. °dONLNd\Ω~Ã(*"Running within a Sub-Heap"°∂ À|À0°∂°∂
  5183. °dONLNdv–~‹!*YA sub-heap for memory allocation is mandatory for Atom Extenders to prevent gridlock when°dONLNd–‹~Ë+* abuffering data.  Sub-heaps are optional for the other code resources that can be called during an°dONLNd2Ë~Ù&* `installation, such as search procedures, Action Atoms and rule functions.   We suggest some do’s°dONLNdìÙ~F* +and don’ts on dealing with sub-heaps below.°dONLNdø~ò*DO’s:
  5184.     °dONLNd≈~'Ö*n
  5185. °dONLNd«ê()WSub-heaps are mandatory for Atom Extenders, but other code resources can run inside the°dONLNd(ê4* ZInstaller’s heap, so enter 0 (size) as the request memory size if you don’t want to bother°dONLNdz4ê@⁄* with sub-heaps.
  5186.     °dONLNdäJ~SÖ(Q~n
  5187. °dONLNdåHêT()\Set the current zone to the application heap before calling any Toolbox routine, and restore°dONLNdÈTê`** \it afterwards.  This assures that memory allocated within these calls won’t get left in your°dONLNdF`êlΩ*     sub-heap.
  5188.     °dONLNdPv~Ö(}~n
  5189. °dONLNdRtêÄ)WUse the Installer’s memory routines, unless you want the memory allocated directly from°dONLNd™Äêå”* your sub-heap.°dONLNdπî~†ß(ù~DON’Ts:
  5190.     °dONLNd¡™~≥Ö*n
  5191. °dONLNd√®ê¥")[Watch out for memory that is left in the sub-heap after you return control to the Installer°dONLNd¥ê¿** \that the system may have references to.  If you set the current zone to the application heap°dONLNd|¿êÃ* Xbefore calling any Toolbox routine you shouldn’t have any problems.  For example, if you°dONLNd÷Ãêÿ* Xcall the GetResource routine (without properly setting the zone) that allocates a handle°dONLNd/ÿê‰* Uinside your sub-heap the Installer may crash after returning control to the Installer
  5192.     °dONLNdÖÓ~˜Ö(ı~n
  5193. °dONLNdáÏꯗ)HNever return a reference to a handle allocated in your sub-heap for the °dONLNdœÏ—¯%(ı—fStaticDataHdl°dONLNdfi¯ê&(ê^field.  Since the sub-heap is destroyed between invocations of the code resource, it’s best to°dONLNd=ê†* use °dONLNdA†‹)
  5194. INewHandle°dONLNdK‹é)<) to allocate any handle you store in the °dONLNdté‚)≤fStaticDataHdl°dONLNdÇ‚˛)T field.
  5195.     °dONLNdã~#Ö(!~n
  5196. °dONLNdçê$)UNever assume you received a sub-heap of the full size requested.  Check that you have°dONLNd„$ê0 * Xenough memory enough to complete your task, since the Installer calls you whether or not°dONLNd<0ê<* Xyour full request was allocated.  Look for warning messages in the Installer Debugger to°dONLNdï<êH* help identify this situation.
  5197. °dONLNd¥\~kÇ(g~&Converting Existing Decompression Code"°∂ j|j0°∂°∂
  5198. °dONLNd€o~{*ZConversion is simple for those decompressors that access files using standard File Manager°dONLNd    6{~á$* `calls.  The Installer routines have been designed to easily replace calls to the high-level File°dONLNd    óá~ì±* ?Manager routines: FSRead, FSWrite, SetFPos, GetFPos and GetEOF.°dONLNd    ◊õ~ß,*_If your decompression code must use a temporary file to store partially decompressed data, then°dONLNd
  5199. 7ß~≥(* cit’s up to you to create and destroy this file.  Space on the target disk can be reserved by adding°dONLNd
  5200. õ≥~ø** athe needed space to one File Atom installed to the target disk.  As an alternative, the Installer°dONLNd
  5201. ˝ø~À∫*
  5202. INewHandle°dONLNd ø∫À%)<T routine can be used to allocate a temporary buffer if sufficient memory exists, but°dONLNd \À~◊n(‘~4the availability of this memory is never guaranteed.ˇ¨dˇ ˇˇˇˇd
  5203. d, Palatino
  5204. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5205.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú70
  5206. °dONLNdQ~](Z~WIf your original decompression code comes from an application and you are using the MPW°dONLNdX]~i)* ^development system, make sure to read Tech. Note #256.  To access global data you will need to°dONLNd∑i~u* Wcreate your own A5 world and switch back to the Installer’s A5 world before calling any°dONLNdu~Å-* `Installer routine or Mac Toolbox trap.  Avoiding global data makes writing code resources easier°dONLNdpÅ~ç#* ]unless your development system (i.e. THINK C) supports using the A4 register to access global°dONLNdŒç~ôó* data.
  5207. °dONLNd‘±6≈
  5208. (¿6Atom Extender Reference"°∂ ≈4≈0°∂°∂
  5209. °dONLNdÏ ~÷&+H`This section describes the data structures and routines that are used by Atom Extenders.  You’ll°dONLNdM÷~‚* Vneed to include the interface file “AtomExtenderHeader.h” or “AtomExtenderHeader.p” to°dONLNd§‚~ÓZ* 2have access to these data structures and routines.
  5210. °dONLNd◊6Ω(6Resource Description"°∂ 40°∂°∂
  5211. °dONLNdÏ~#.+HaInformation about how to call the Atom Extender code resource is contained in the script resource°dONLNdN#~/'* _of type ‘inex’.  New versions of File Atoms, Resource Atoms and Font Atoms reference the ‘inex’°dONLNdÆ/~;ê* ?resource using its resource ID.  The resource has the template:,
  5212. Courier°dONLNdÓK~W®*#define°dONLNdˆK¥W)6atomExtenderFlags°dONLNdK¯W˛(T¯\°dONLNdV¢bÃ(_¢boolean°dONLNd!VÍb»)H%dontSendInitMessage, sendInitMessage;°dONLNdIV¯b˛(_¯\°dONLNdMa¢mÃ(j¢boolean°dONLNdVaÍm‡)H)dontSendBeforeMessage, sendBeforeMessage;°dONLNdÅa¯m˛(j¯\°dONLNdÖl¢xÃ(u¢boolean°dONLNdélÍx‘)H'dontSendAfterMessage, sendAfterMessage;°dONLNd∑l¯x˛(u¯\°dONLNdªw¢ÉÃ(Ä¢boolean°dONLNdƒwÍÉÏ)H+dontSendSuccessMessage, sendSuccessMessage;°dONLNdw¯É˛(į\°dONLNdÙÇ¢éÃ(ã¢boolean°dONLNd˝ÇÍé‡)H)dontSendCancelMessage, sendCancelMessage;°dONLNd(ǯé˛(ã¯\°dONLNd,ç¢ôÃ(ñ¢boolean°dONLNd5çÍô⁄)H(continueBusyCursors, suspendBusyCursors;°dONLNd_ç¯ô˛(ñ¯\°dONLNdcò¢§(°¢
  5213. fill bit[10];°dONLNdqÆ~∫Ã(∑~
  5214. type 'inex' {°dONLNdÅπ¢≈“+$ switch {°dONLNd烥–+
  5215. case format0:°dONLNdüœΔ€&+ key integer = 0;°dONLNd≤œV€)ê/* Extender Format version */°dONLNd‘⁄ΔÊ2(„ΔatomExtenderFlags;°dONLNdË⁄VÊÊ)ê/* Flags for Format 0 */°dONLNdÂΔÒ,(ÓΔunsigned longInt;°dONLNdÂVÒÊ)ê/* Code resource Type */°dONLNd6Δ¸(˘Δinteger°dONLNdCV¸⁄)ê/* Code resource ID */°dONLNd^˚Δˆ(ΔlongInt;°dONLNdl˚V¬)ê/* Refcon Value */°dONLNdÉΔˆ(ΔlongInt;°dONLNdëVÚ)ê/* Required Free Memory */°dONLNd∞Δ,(ΔevenPaddedString;°dONLNdƒVÊ)ê/* Status Description */°dONLNd‡¢(Æ(%¢};°dONLNd„'~3ä(0~};
  5216.     °dONLNdÊC~N‘*Flag descriptions
  5217. °dONLNd¯Q~]ÿ*sendInitMessage°dONLNdQ]T)êAsks to send an °dONLNdQT]ñ)F kInitialize°dONLNd#Qñ],)B  message to those Atom Extenders°dONLNdD]iÛ(f2attached to atoms that will be executed during the°dONLNdwiufi* .installation.  The Atom Extender receives the °dONLNd•ifiu )– kInitialize°dONLNd±uÅ!(~>message after each time the user clicks the Install button and°dONLNdÅç€* 0preflighting is successful.  The purpose of the °dONLNd Å€ç)Õ kInitialize°dONLNd,çô.(ñ>message is to allocate any static memory needed to communicate°dONLNdkô•* between Atom Extenders.°dONLNdÉ≠~π‰(∂~sendBeforeMessage°dONLNdï≠πO)êAsks to send a °dONLNd§≠Oπë)A kBeforePart°dONLNdØ≠ëπ)B message to the Atom Extender°dONLNdÕπ≈(¬<code resource when the atom part is ready to be copied.  The°dONLNd    
  5218. ≈—* <Installer has found and opened the source file that the part°dONLNd    G—›* ?exists in and is ready to begin buffering the source data.  Theˇdˇ ˇˇˇˇd
  5219. d, Palatino
  5220. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5221.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú71
  5222. °dONLNdQ]    (Z7Atom Extender can override the Installer’s default copy°dONLNd8]i* 8mechanism by using the supplied routines and returning a,
  5223. Courier°dONLNdqiuP* kCopiedData°dONLNd|iPuÖ)B
  5224.  result code.°dONLNdä}~âfi(Ü~sendAfterMessage°dONLNdõ}âT)êAsks to send an °dONLNd´}Tâê)F
  5225. kAfterPart°dONLNdµ}êâ)< message to the Atom Extender°dONLNd”âï-(íAcode resource for each part that has been successfully written by°dONLNdï°Æ* $the Installer or Atom Extender.  An °dONLNd9ïưÍ)†
  5226. kAfterPart°dONLNdCïͰ)<  message is°dONLNdO°≠(™9only sent if the Installer performed the copy or the Atom°dONLNdâ≠πW* Extender called °dONLNdô≠Wπ±)IWriteTargetData°dONLNd®≠±π))Z (with data length greater°dONLNd√π≈X(¬than 0) during a °dONLNd‘πX≈ö)J kBeforePart°dONLNdflπö≈ƒ)B     message.°dONLNdÈÕ~ŸÍ(÷~sendSuccessMessage°dONLNd¸ÕŸO)êAsks to send a °dONLNd ÕOŸ)AkSuccess°dONLNdÕŸ)0" message to the Atom Extender code°dONLNd6ŸÂ˝(‚7resource after the entire installation has successfully°dONLNdnÂÒö* completed.  The purpose of the °dONLNdçÂöÒ )åkSuccess°dONLNdï Ò#)0 message is to allow°dONLNd™Ò˝Ù(˙2disposal of any static memory allocated during the°dONLNd›˝    P* kInitialize°dONLNdË˝P    )B- message, and delete any temporary files that°dONLNd    ((<were created by the Extender. Only those Atom Extenders that°dONLNdS!7*     received °dONLNd\7!y)) kInitialize°dONLNdgy!‰)B messages will be sent a °dONLNdĉ!)kkSuccess°dONLNdâ!-6(*message.°dONLNdî5~A‰(>~sendCancelMessage°dONLNd¶5AO)êAsks to send a °dONLNdµ5OAy)AkCancel°dONLNdº5yA)*" message to the Atom Extender code°dONLNdflAM$(J@resource when the user cancels the installation, an error forces°dONLNd MY * 9the installation to stop, or an Atom Extender cancels the°dONLNdZYe¢* "installation.  The purpose of the °dONLNd|Y¢eÃ)îkCancel°dONLNdÉYÃe+)* message is to reverse°dONLNdöeq(n7any changes that were made during the installation, and°dONLNd“q}Ô* 1dispose of any static memory allocated during the°dONLNd}âP* kInitialize°dONLNd}Pâ)B) message.  Only those Atom Extenders that°dONLNd9âï7(í    received °dONLNdBâ7ïy)) kInitialize°dONLNdMâyï‰)B messages will be sent a °dONLNdfâ‰ï)kkCancel°dONLNdnï°6(ûmessage.
  5227.     °dONLNdw´~∂◊(≥~Field descriptions
  5228. °dONLNdäπ~≈Í*Code Resource Type°dONLNdùπ≈)ê:The resource type of the Atom Extender code resource to be°dONLNdÿ≈—[* called.  (4-bytes)°dONLNdÏŸ~Âfi(‚~Code Resource ID°dONLNd˝ŸÂ+)ê@The resource ID of the Atom Extender code resource to be called.°dONLNd?ÂÒ7*     (2-bytes)°dONLNdJ˘~Δ(~ RefCon Value°dONLNdW˘µ)ê%The value that will be passed in the °dONLNd|˘µfl)ßfRefCon°dONLNdɢfl)*
  5229.  field of the°dONLNdëÕ()Atom Extender parameter block.  (4-bytes)°dONLNdº~%ˆ("~Required Free Memory°dONLNd—%$)ê;The minimum number of free bytes the Atom Extender needs in°dONLNd
  5230. %1* 5its own heap to make local allocation of memory using°dONLNdC1=Ã* )Macintosh OS/Toolbox routines.  (4-bytes)°dONLNdnE~QÍ(N~Status Description°dONLNdÅEQ-)ê@An optional string that is displayed in the Status dialog during°dONLNd¬Q]* ;execution of the Atom Extender. (even-padded Pascal string)
  5231. °dONLNdˇq6Åú(}6Data Structures"°∂ Å4Å0°∂°∂
  5232. °dONLNd¶6¥ú*3Function Interface"°∂ ¥4¥0°∂°∂
  5233. °dONLNd"π~≈”+HKThe entry point of the Atom Extender code resource must have the interface:°dONLNdn…~’∫*
  5234. ResultCode°dONLNdy…Δ’n)HMyAtomExtender(ExtenderPBPtr°dONLNdñ…z’‡)¥myExtenderPBPtr);ˇ|dˇ ˇˇˇˇd
  5235. d, Palatino
  5236. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5237.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú72
  5238. °dONLNdQ~](Z~]The Atom Extender should return a result telling the Installer what to do after executing the°dONLNd^]~i¨* Gcode resource.  You can use these constants to specify the result code:,
  5239. Courier°dONLNd¶m~y“*typedef enum {°dONLNd∂xêш+ kFatalError = -1,°dONLNdÀx2Ñ)¢//* Stop installation with error user dialog. */°dONLNd¸Ñêê(çêkContinueAsNormal = 0,°dONLNdÑ2êÛ)¢,/* Request default action from Installer. */°dONLNdBêêú (ôêkCancelInstallation = 1,°dONLNd[ê2ú)¢2/* Cancel installation with cancel user dialog. */°dONLNdèúê®Í(•êkCopiedData = 2°dONLNd¢ú2®±)¢/* Override default copy on °dONLNdæú±®Û) kBeforePart°dONLNd…úÛ®))B  message. */°dONLNd÷®~¥Ã(±~
  5240. } ResultCode;
  5241. °dONLNd‰√6—ë(Õ6Parameter Block"°∂ —4—0°∂°∂
  5242. °dONLNdÙ÷~‚'+H[The AtomExtender parameter block contains information about the atom being installed.  Most°dONLNdP‚~Ó* WAtom Extenders will only need to reference a few fields from this parameter block.  The°dONLNd®Ó~˙* "parameter block has the structure:°dONLNdÀ˛~
  5243. ‰*typedef  struct {°dONLNdfi    êˆ+ ExtenderMessageID°dONLNd    ¸>)l fMessageID;°dONLNd˝ê ¥(êHandle°dONLNd¸ V)lfStaticDataHdl;°dONLNdê+∫((êProcPtr°dONLNd#¸+b)lfCallBackProcPtr;°dONLNd6*ê6Æ(3êshort°dONLNd@*¸6V)lfTargetVRefNum;°dONLNdQ5êA®(>êlong°dONLNdZ5¸An)lfTargetFolderDirID;°dONLNdo@êLÆ(Iêshort°dONLNdy@¸LV)lfSystemVRefNum;°dONLNdäKêW®(Têlong°dONLNdìK¸Wt)lfSystemBlessedDirID;°dONLNd©Vêb®(_êlong°dONLNd≤V¸b,)lfRefCon;°dONLNdºaêm¿(jêDataType°dONLNd»a¸m8)l
  5244. fDataType;°dONLNd”l~xˆ(u~} EnvironsHeaderRec;°dONLNdËÇ~é‰*typedef  struct {°dONLNd˚çêô¥+ FSSpec°dONLNdç¸ôD)l fSourceFile;°dONLNdòê§¥(°êFSSpec°dONLNdò¸§D)l fTargetFile;°dONLNd+£êØ®(¨êlong°dONLNd4£¸Øb)lfTotalTargetSize;°dONLNdGÆê∫®(∑êlong°dONLNdPƸ∫\)lfTargetPosStart;°dONLNdbπê≈®(¬êlong°dONLNdkπ¸≈\)lfTargetPartSize;°dONLNd}ƒê–®(Õêlong°dONLNd܃¸–\)lfSourcePartSize;°dONLNdòœê€®(ÿêlong°dONLNd°œ¸€t)lfInstallerTempDirID;°dONLNd∂⁄~Êfi(„~} CopyHeaderRec;°dONLNd«~¸‰*typedef  struct {°dONLNd⁄˚êˆ+ EnvironsHeaderRec°dONLNdÌ˚Ä)~fEnvironmentHeader;°dONLNdêfi(ê
  5245. CopyHeaderRec°dONLNdb)~fCopyPBHeader;°dONLNd!~ÿ(~} BasicCopyRec;°dONLNd1'~3‰*typedef  struct {°dONLNdD2ê>ˆ+ EnvironsHeaderRec°dONLNdW2>Ä)~fEnvironmentHeader;°dONLNdl=êIfi(Fê
  5246. CopyHeaderRec°dONLNd|=Ib)~fCopyPBHeader;°dONLNdåHêT∫(QêResType°dONLNdòHTn)~fSourceRsrcType;°dONLNd™Sê_Æ(\êshort°dONLNdµS_b)~fSourceRsrcID;°dONLNd≈^êj∫(gêResType°dONLNd—^jn)~fTargetRsrcType;°dONLNd„iêuÆ(rêshort°dONLNdÓiub)~fTargetRsrcID;°dONLNd˛têÄ¥(}êStr255°dONLNd    tÄn)~fTargetRsrcName;°dONLNdêãÆ(àêshort°dONLNd&ãt)~fTargetRsrcAttrs;°dONLNd8ä~ñ“(ì~} RsrcCopyRec;°dONLNdG†~¨‰*typedef  struct {°dONLNdZ´ê∑ˆ+ EnvironsHeaderRec°dONLNdm´∑Ä)~fEnvironmentHeader;°dONLNdÇ∂ꬉ(øêTCopyHeaderRec°dONLNdì∂¬b)~fCopyPBHeader;°dONLNd£¡êÕ∫( êResType°dONLNdØ¡ÕÜ)~fSourceFontRsrcType;°dONLNdƒ¡åÕ)~/* usually ‘part’ */°dONLNd⁄ÃêÿÆ(’êshort°dONLNdÂÃÿz)~fSourceFontRsrcID;°dONLNd˘◊ê„∫(‡êResType°dONLNd◊„Ü)~fTargetFontRsrcType;°dONLNd◊å„")~/* FONT, NFNT, or sfnt */ˇ⁄dˇ ˇˇˇˇd
  5247. d, Palatino
  5248. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5249.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú73,
  5250. Courier
  5251. °dONLNdQê]Æ(Zêshort°dONLNd Q]z)~fTargetFontRsrcID;°dONLNd\êh¥(eêStr255°dONLNd*\hÜ)~fTargetFontRsrcName;°dONLNd@gêsÆ(pêshort°dONLNdKgså)~fTargetFontRsrcAttrs;°dONLNdbrê~¥({êStr255°dONLNdmr~V)~ fFamilyName;°dONLNd{}êâÆ(Üêshort°dONLNdÜ}âJ)~
  5252. fFamilyID;°dONLNdíàêîÆ(ëêshort°dONLNdùàîJ)~
  5253. fFontSize;°dONLNd©ìêüÆ(úêshort°dONLNd¥ìüP)~ fFontStyle;°dONLNd¿û~™“(ß~} FontCopyRec;°dONLNdœ¥~¿ÿ*typedef union {°dONLNdflø~Àfi*     BasicCopyRec°dONLNdÚøÀV)ê fBasicPBRec;°dONLNdˇ ~÷fi(”~    BasicCopyRec°dONLNd ÷h)êfFileCopyPBRec;°dONLNd"’~·ÿ(fi~    RsrcCopyRec°dONLNd4’·h)êfRsrcCopyPBRec;°dONLNdD‡~Ïÿ(È~    FontCopyRec°dONLNdV‡Ïh)êfFontCopyPBRec;°dONLNdfÎ~˜>(Ù~ } ExtenderPBRec, *ExtenderPBPtr;
  5254.     °dONLNdá~◊*Field descriptions
  5255. °dONLNdõ~!∫*
  5256. fMessageID°dONLNd¶!)ê8One of five messages the Atom Extender will receive when°dONLNdfl!-** ?being called. Use these constants to understand the message ID:°dONLNd 5Ab*typedef enum {°dONLNd0@2Lí+$ kInitialize = 0,°dONLNdBK2Wt* kBeforePart°dONLNdNKzWí)H= 1,°dONLNdTV2bn(_2
  5257. kAfterPart°dONLNd_Vzbí)H= 2,°dONLNdea2mh(j2    kSuccess °dONLNdoazmí)H= 3,°dONLNdul2x\(u2kCancel°dONLNd}lzxå)H= 4°dONLNdÅwÉÜ(Ä} ExtenderMessageID;°dONLNdóäñ*:Certain fields in the Atom Extender parameter block may or°dONLNd“ñ¢* <may not be valid when receiving a specific message.  Each of°dONLNd¢Æ&* >the following field descriptions include a note about when the°dONLNdNÆ∫N* field is valid.°dONLNd^¬~Œ“(À~fStaticDataHdl°dONLNdm¬Œ$)ê9A handle created by the Atom Extender using INewHandle to°dONLNdߌ⁄* 9save information between calls to this Atom Extender code°dONLNd·⁄Ê* 5resource.  The field is always NULL when receiving an°dONLNdÊÚP* kInitialize°dONLNd"ÊPÚ)B/ message.  You can assign a value to this field°dONLNdRÚ˛(˚:during any call to the Atom Extender, and receive the same°dONLNdç˛
  5258. * <value in this field during the next message.  (Valid for all°dONLNd 
  5259. >*
  5260. messages.)°dONLNd’~*fi('~fCallBackProcPtr°dONLNdÊ*")ê@A pointer to the Installer’s dispatcher routine.  You’ll need to°dONLNd'*6* <pass this field as a parameter to glue routines that provide°dONLNdd6B* 9access to Installer functions.  (Valid for all messages.)°dONLNdûJ~V“(S~fTargetVRefNum°dONLNd≠JV,)ê>The target disk’s vRefNum.  When allowing the user to select a°dONLNdÏVb* :target application folder, this is the volume on which the°dONLNd'bnƒ* *folder resides.  (Valid for all messages.)°dONLNdRv~ÇÍ(~fTargetFolderDirID°dONLNdevÇ,)êBThe target application folder’s directory ID.  This value is -1 if°dONLNd®Çé#* @the user cannot select a target application folder.  Target File°dONLNdÈéö¬* (Specs that use the reserved folder path °dONLNdé¬ö)¥ folder-user°dONLNdéö&)B will be°dONLNd%ö¶„(£1placed in this folder.  (Valid for all messages.)°dONLNdWÆ~∫“(∑~fSystemVRefNum°dONLNdfÆ∫)ê:The System disk’s vRefNum.  Target File Specs that use the°dONLNd°∫Δn* reserved folder path °dONLNd∂∫nΔ∞)` special-xxx°dONLNd¡∫∞Δ)B will be placed in the°dONLNdÿΔ“ (œ8System Folder on this volume.  (Valid for all messages.)ˇFdˇ ˇˇˇˇd
  5261. d, Palatino
  5262. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5263.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú74,
  5264. Courier
  5265. °dONLNdQ~]Í(Z~fSystemFolderDirID°dONLNdQ])ê:The directory ID of the System Folder on the disk with the°dONLNdN]i3* refNum °dONLNdU]3iá)%fSystemVRefNum°dONLNdc]ái)T$.  This directory is not necessarily°dONLNdàiu#(r>the currently active System Folder.  (Valid for all messages.)°dONLNd«}~â®(Ü~fRefCon°dONLNdœ}â")ê?A 4-byte value defined by the scriptwriter in the ‘inex’ script°dONLNdâï™* $resource.  (Valid for all messages.)°dONLNd4ù~©¥(¶~    fDataType°dONLNd>ù©)ê;One of five values that specifies the type of data the Atom°dONLNdz©µ* ;Extender has been given.  Use this value to determine which°dONLNd∂µ¡* 9type of atom is being installed, and which variant of the°dONLNd¡Õ* 7parameter block should be used.  Use these constants to°dONLNd(ÕŸÑ* understand the data type:°dONLNdD·Ìb*typedef enum {°dONLNdUÏ2¯ò+$ kFileAtomDataFork°dONLNdiÏʯ˛)¥= 0,°dONLNdo˜2ò(2kFileAtomRsrcFork°dONLNdɘÊ˛)¥= 1,°dONLNdâ2‘( 2kFileAtomRsrcForkInDataFork°dONLNd•Ê˛)¥= 2,°dONLNd´
  5266. 2h(2    kRsrcAtom°dONLNd∏
  5267. Ê˛)¥= 3,°dONLNdæ2$h(!2    kFontAtom°dONLNdÀÊ$¯)¥= 4°dONLNdœ#/P(, } DataType;°dONLNd‹6B*(Valid for all messages.)°dONLNdˆJ~V¿(S~ fSourceFile°dONLNdJV)ê:An FSSpec record specifying the source file from which the°dONLNd=Vb∞* &source data is read.  (Valid only for °dONLNdcV∞bÚ)¢ kBeforePart°dONLNdnVÚb)B and°dONLNdsbnJ(k
  5268. kAfterPart°dONLNd}bJn|)<  messages.)°dONLNdâv~Ç¿(~ fTargetFile°dONLNdïvÇ+)ê?An FSSpec record specifying the target file to which the target°dONLNd’Çé†* "data is written.  (Valid only for °dONLNd˜Ç†é‚)í kBeforePart°dONLNdÇ‚éı)B and°dONLNdéöJ(ó
  5269. kAfterPart°dONLNdéJö|)<  messages.)°dONLNd¢~Æfi(´~fTotalTargetSize°dONLNd.¢Æ&)ê@The number of bytes all source pieces will occupy in the target.°dONLNdpÆ∫U* (Valid only for °dONLNdÄÆU∫ó)G kBeforePart°dONLNdãÆó∫¨)B and °dONLNdêÆ¨∫Ë)
  5270. kAfterPart°dONLNdöÆË∫)<  messages.)°dONLNd¶¬~Œÿ(À~fTargetPosStart°dONLNd∂¬Œ)ê;The offset in bytes into the target data the part’s data is°dONLNdÚŒ⁄ê* written.  (Valid only for the °dONLNdŒê⁄“)Ç kBeforePart°dONLNdŒ“⁄Á)B and °dONLNd ŒÁ⁄#)
  5271. kAfterPart°dONLNd+⁄Ê>(„
  5272. messages.)°dONLNd6Ó~˙ÿ(˜~fTargetPartSize°dONLNdFÓ˙)ê<The size in bytes the part’s data will occupy in the target.°dONLNdÑ˙g* (Valid only for the °dONLNdò˙g©)Y kBeforePart°dONLNd£˙©æ)B and °dONLNd®˙æ˙)
  5273. kAfterPart°dONLNd≤˙˙,)<  messages.)°dONLNdæ~ÿ(~fSourcePartSize°dONLNdŒ()êAThe size in bytes the part’s data occupies in the source.  (Valid°dONLNd&E*
  5274. only for the °dONLNdE&á)7 kBeforePart°dONLNd(á&µ)B
  5275.  message.)°dONLNd3.~:(7~fInstallerTempDirID°dONLNdG.:)ê=The directory ID of the Installer temp folder on the target’s°dONLNdÖ:F,* Dvolume that contains the original target file.  If this field is -1,°dONLNd FR)* Bthe original file was not saved or did not exist.  You can get the°dONLNd
  5276. R^§*  target’s volume refNum from the °dONLNd-R§^Ê)ñ fTargetFile°dONLNd8RÊ^&)B field.  (Valid°dONLNdH^jE(g
  5277. only for the °dONLNdU^Ejá)7 kBeforePart°dONLNd`^ájú)B and °dONLNde^újÿ)
  5278. kAfterPart°dONLNdo^ÿj
  5279. )<  messages.)
  5280.     °dONLNd{t~<(|~%Field descriptions for Resource Atoms
  5281. °dONLNd°Ç~éÿ*fSourceRsrcType°dONLNd±Çé)ê?The resource type of the source resource part.  (Valid only for°dONLNdÒéöP* kBeforePart°dONLNd¸éPöe)B and °dONLNdéeö°)
  5282. kAfterPart°dONLNd é°ö”)<  messages.)°dONLNd¢~ÆÃ(´~
  5283. fSourceRsrcID°dONLNd%¢Æ)ê=The resource ID of the source resource part.  (Valid only for°dONLNdcÆ∫P* kBeforePart°dONLNdnÆP∫e)B and °dONLNdsÆe∫°)
  5284. kAfterPart°dONLNd}ư∫”)<  messages.)°dONLNdâ¬~Œÿ(À~fTargetRsrcType°dONLNdô¬Œ
  5285. )ê:The resource type of the target resource.  (Valid only for°dONLNd‘Œ⁄P* kBeforePart°dONLNdflŒP⁄e)B and °dONLNd‰Œe⁄°)
  5286. kAfterPart°dONLNdÓŒ°⁄”)<  messages.)ˇ@dˇ ˇˇˇˇd
  5287. d, Palatino
  5288. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5289.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú75,
  5290. Courier
  5291. °dONLNdQ~]Ã(Z~
  5292. fTargetRsrcID°dONLNdQ])ê8The resource ID of the target resource.  (Valid only for°dONLNdG]iP* kBeforePart°dONLNdR]Pie)B and °dONLNdW]ei°)
  5293. kAfterPart°dONLNda]°i”)<  messages.)°dONLNdmq~}ÿ(z~fTargetRsrcName°dONLNd}q})ê=The resource name to be given to the target resource.  (Valid°dONLNdª}â3*     only for °dONLNdƒ}3âu)% kBeforePart°dONLNdœ}uâä)B and °dONLNd‘}äâΔ)
  5294. kAfterPart°dONLNdfi}Δâ¯)<  messages.)°dONLNdÍë~ùfi(ö~fTargetRsrcAttrs°dONLNd˚ëù )ê;The resource attributes to be given to the target resource.°dONLNd8ù©U* (Valid only for °dONLNdHùU©ó)G kBeforePart°dONLNdSùó©¨)B and °dONLNdXù¨©Ë)
  5295. kAfterPart°dONLNdbùË©)<  messages.)
  5296.     °dONLNdn≥~æ#(ª~!Field descriptions for Font Atoms
  5297. °dONLNdê¡~Õ*fSourceFontRsrcType°dONLNd§¡Õ$)ê@The resource type of the source font resource part.  (Valid only°dONLNdÂÕŸ* for °dONLNdÈÕŸ_) kBeforePart°dONLNdÙÕ_Ÿt)B and °dONLNd˘ÕtŸ∞)
  5298. kAfterPart°dONLNdÕ∞Ÿ‚)<  messages.)°dONLNd·~̉(Í~fSourceFontRsrcID°dONLNd!·Ì*)êBThe resource ID of the source font resource part.  (Valid only for°dONLNddÌ˘P* kBeforePart°dONLNdoÌP˘e)B and °dONLNdtÌe˘°)
  5299. kAfterPart°dONLNd~̰˘”)<  messages.)°dONLNdä~
  5300. (
  5301. ~fTargetFontRsrcType°dONLNdû
  5302. )ê?The resource type of the target font resource.  (Valid only for°dONLNdfi
  5303. P* kBeforePart°dONLNdÈ
  5304. Pe)B and °dONLNdÓ
  5305. e°)
  5306. kAfterPart°dONLNd¯
  5307. °”)<  messages.)°dONLNd!~-‰(*~fTargetFontRsrcID°dONLNd!-%)ê?The resource ID of the target font resource, which is not known°dONLNdV-9.* Buntil the part has been written by the Installer.  (Valid only for°dONLNdô9E * the °dONLNdù9 E\)
  5308. kAfterPart°dONLNdß9\Eé)<  messages.)°dONLNd≥M~Y(V~fTargetFontRsrcName°dONLNd«MY.)êBThe resource name to be given to the target font resource.  (Valid°dONLNd
  5309. Ye3*     only for °dONLNdY3eu)% kBeforePart°dONLNdYueä)B and °dONLNd#YäeΔ)
  5310. kAfterPart°dONLNd-YΔe¯)<  messages.)°dONLNd9m~yˆ(v~fTargetFontRsrcAttrs°dONLNdNmy)ê@The resource attributes to be given to the target font resource.°dONLNdêyÖU* (Valid only for °dONLNd†yUÖó)G kBeforePart°dONLNd´yóÖ¨)B and °dONLNd∞y¨ÖË)
  5311. kAfterPart°dONLNd∫yËÖ)<  messages.)°dONLNdΔç~ô¿(ñ~ fFamilyName°dONLNd“çô)ê7The family name (i.e. “Times”, “Geneva”… ).  The source°dONLNd
  5312. ô•%* >‘FOND’ resource can be found using this name.  (Valid only for°dONLNdI•±P* kBeforePart°dONLNdT•P±e)B and °dONLNdY•e±°)
  5313. kAfterPart°dONLNdc•°±”)<  messages.)°dONLNdoπ~≈¥(¬~    fFamilyID°dONLNdyπ≈.)ê>The family ID.  Normally this is the resource ID of the ‘FOND’°dONLNd∏≈—Ä* resource.  (Valid only for °dONLNd”≈Ä—¬)r kBeforePart°dONLNdfi≈¬—◊)B and °dONLNd„≈◊—)
  5314. kAfterPart°dONLNdÓ—›>(⁄
  5315. messages.)
  5316. °dONLNd˘ı6    ë(6(About Version Compare Functions (‘invc’)"°∂     4    0°∂°∂
  5317. °dONLNd"~+H\Version Compare functions allow external code resources to be called when the target file or°dONLNd~&
  5318. * Xresource’s version must be determined in order to compare with the source version number°dONLNdÿ&~2‚* supplied in the script.°dONLNdÒ:~F*ZThe Installer 3.X versions allow the scriptwriter to specify how it should handle the case°dONLNdLF~R* [where the target file is newer than the source file.  This usually prevents downgrading the°dONLNd®R~^* Zuser’s software, but the opposite case may occur where downgrading is required to maintain°dONLNd^~j* Zsync-ed versions of software.  Previously, the determination of “newness” was dependent on°dONLNd^j~v* acomparing the creation dates of the target file to the value in the source ‘infs’ resource.  This°dONLNd¿v~Ç£* Cworks most of the time, but is not a reliable way to compare files.°dONLNd    ä~ñ&*aAll files being installed should have a version resource (‘vers’ 1 and maybe a ‘vers’ 2), and the°dONLNd    fñ~¢!* bability to “newness” of files based on version resource is a desirable feature.  Installer 4.0 now°dONLNd    …¢~Æ(* %provides three ways to compare files:,
  5319.  
  5320. Zapf Dingbats
  5321.     °dONLNd    Ô∏~¡Ö*n
  5322. °dONLNd    Ò∂ê¬;)&Old way using creation date.  Use the °dONLNd
  5323. ∂;¬π)´useSrcCrDateToCompare°dONLNd
  5324. ,∂π¬)~ flag in the File Atom.
  5325.     °dONLNd
  5326. DÃ~’Ö(”~n
  5327. °dONLNd
  5328. F ê÷)ZDefault version number comparison using the ‘vers’ 1 resource in the target file.  Use the°dONLNd
  5329. °÷ê‚* useVersProcToCompare°dONLNd
  5330. µ÷‚)x? flag in the File Atom.  Place the source version number in theˇ¸dˇ ˇˇˇˇd
  5331. d, Palatino
  5332. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5333.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú76,
  5334. Courier
  5335. °dONLNdQê](ZêSource Version Number°dONLNdQ]ò)~! field and place 0 (zero) in the °dONLNd6Qò]")äVersion Compare Rsrc ID°dONLNdN]êi˜(fêfield of the File Atom.,
  5336.  
  5337. Zapf Dingbats
  5338.     °dONLNdfs~|Ö(z~n
  5339. °dONLNdhqê}+)^Custom determination of the target version number of a file or resource using a code resource.°dONLNd»}êâµ* Use the °dONLNd–}µâ-)%useVersProcToCompare°dONLNd‰}-â.)x; flag in the File Atom.  Place the source version number in°dONLNd âêï¢(íêthe °dONLNd$â¢ï )Source Version Number°dONLNd9â ïÁ)~/ field and place the ‘invc’ resource ID in the °dONLNdhâÁï)«Version°dONLNdpïê°Í(ûêCompare Rsrc ID°dONLNdïͰ¢)Z) field of the File Atom or Resource Atom.
  5340. °dONLNd©µ~ƒµ(¿~/Using Version Compare Functions with File Atoms"°∂ √|√0°∂°∂
  5341. °dONLNdŸ»~‘-*`During preflighting of the target disk the Installer will call the Version Compare code resource°dONLNd:‘~‡* `for each existing target file that references a valid ‘invc’ script resource.  Upon entering the°dONLNdõ‡~Ï#* ccode resource the current resource file will have been set to the target file, so the code resource°dONLNdˇÏ~¯%* _can easily make Resource Manager calls to read an alternative version resource.  If the version°dONLNd_¯~* `information is stored in the data fork, or in another file the code resource must open and close°dONLNd¿~⁄* the file themselves.°dONLNd’~$#*_The Compare Version code resource must return the version number as the function result.  If an°dONLNd5$~0¶* Derror occurs while finding the version number, then return 0 (zero).°dONLNdz8~D≠*CAllowable Installer functions when comparing the version of a file:
  5342.     °dONLNdæN~WÖ*n
  5343. °dONLNd¿LêX)IMemory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  5344.     °dONLNd
  5345. b~kÖ(i~n
  5346. °dONLNd `êlK))Action Handler function:  RegisterAction.
  5347. °dONLNd6Ä~è€(ã~3Using Version Compare Functions with Resource Atoms"°∂ é|é0°∂°∂
  5348. °dONLNdjì~ü-*`During preflighting of the target disk the Installer will call the Version Compare code resource°dONLNdÀü~´,* dfor each existing target resource that references a valid ‘invc’ script resource.  Upon entering the°dONLNd0´~∑$* ccode resource the current resource file will have been set to the file the target resource resides.°dONLNdï∑~√F* .The code resource should call the Installer’s °dONLNd√∑F√ö)»ReadTargetData°dONLNd—∑ö√%)T  routine to read from the target°dONLNdÚ√~œ((Ã~_resource.  This should allow most resource version schemes using a header to easily and quickly°dONLNdRœ~€** ^determine the version number of the resource.  Using Resource Manager calls should be avoided.°dONLNd≤„~Ô#*_The Compare Version code resource must return the version number as the function result.  If an°dONLNdÔ~˚¶* Derror occurs while finding the version number, then return 0 (zero).°dONLNdW~¿*GAllowable Installer functions when comparing the version of a resource:
  5349.     °dONLNdü~"Ö*n
  5350. °dONLNd°ê#)IMemory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  5351.     °dONLNdÎ-~6Ö(4~n
  5352. °dONLNdÌ+ê7fi)CTarget functions:  ReadTargeData, GetTargeDataEOF, GetTargeDataPos,°dONLNd    17êC„* SetTargeDataPos.
  5353.     °dONLNd    BM~VÖ(T~n
  5354. °dONLNd    DKêWK))Action Handler function:  RegisterAction.
  5355. °dONLNd    nk~zw(v~#Version Compare Runtime Environment"°∂ y|y0°∂°∂
  5356. °dONLNd    í~~ä*WThe Version Compare code resource shares memory space with the Installer.  Local memory°dONLNd    Íä~ñ!* ]allocation using Memory Manager calls will come from the Installer’s heap.  Please be nice to°dONLNd
  5357. Hñ~¢©*     our heap.ˇ
  5358. ídˇ ˇˇˇˇd
  5359. d, Palatino
  5360. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5361.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú77
  5362. °dONLNdQ6ep(`6"Version Compare Function Reference"°∂ e4e0°∂°∂
  5363. °dONLNd#j~v(+HaThis section describes the function interface and resource descriptions needed to use the Version°dONLNdÖv~ÇÏ* Compare script resource.
  5364. °dONLNdûñ6¶™(¢6Function Interface"°∂ ¶4¶0°∂°∂
  5365. °dONLNd±´~∑+HVThe Installer calls your Version Compare code resource assuming the following function°dONLNd∑~√™*
  5366. interface.,
  5367. Courier°dONLNd“~fi§*long ComputeVersionNumber( ComputeVersionPBPtr );°dONLNdEÏ~¯(*^The Version Compare function writer must return a version number.  The version number consists°dONLNd§¯~* Yof four bytes defined from the high byte as:  major revision level, minor revision level,°dONLNd˛~u* 7development stage, and prerelease revision level.  See °dONLNd5u)˜$Inside Macintosh:  Macintosh Toolbox°dONLNdZ~¨(~
  5368. Essentials°dONLNdd¨))., page 7-31 for more details.
  5369. °dONLNdÇ06@û(<6Parameter Block"°∂ @4@0°∂°∂
  5370. °dONLNdíE~Q+HYThe version compare code resource is passed a pointer to a parameter block containing the°dONLNdÏQ~]À* callback pointer.°dONLNd˛a~m‰*typedef  struct {°dONLNdlêx∫+ ProcPtr°dONLNdlÍxP)ZfCallBackProcPtr;°dONLNd-w~Ét(Ä~)} ComputeVersionPB, *ComputeVersionPBPtr;
  5371.     °dONLNdWì~û◊*Field descriptions
  5372. °dONLNdk°~≠fi*fCallBackProcPtr°dONLNd|°≠)ê>A pointer to the Installer’s dispatch routine.  You’ll need to°dONLNdª≠π* 9pass this field as a parameter to Installer function glue°dONLNdıπ≈5*     routines.
  5373. °dONLNdˇŸ6ÈΩ(Â6Resource Description"°∂ È4È0°∂°∂
  5374. °dONLNdÓ~˙¥+HCThe template of the Version Compare script resource is shown below.°dONLNdX˛~
  5375. ®*#define°dONLNd`˛¥
  5376. &)6versionCompareFlags°dONLNdu˛D
  5377. J)ê\°dONLNdy    ¢(¢
  5378. fill bit[16];°dONLNdá~+Ã((~
  5379. type 'invc' {°dONLNdó*¢6“+$ switch {°dONLNd£5¥A+
  5380. case format0:°dONLNdµ@ΔL&+ key integer = 0;°dONLNd«@DLº)~/* Format version */°dONLNd‡KΔW>(TΔversionCompareFlags;°dONLNdıKDW¬)~/* Version Compare */°dONLNdVΔb&(_Δliteral longint;°dONLNd!VDb)~$/* Version Compare Code Rsrc Type */°dONLNdJaΔmˆ(jΔinteger;°dONLNdWaDm)~"/* Version Compare Code Rsrc ID */°dONLNd~lΔxˆ(uΔlongint;°dONLNdãlDx¯)~/* Minimal Requested Memory */°dONLNdÆwΔÉ,(ÄΔevenPaddedString;°dONLNd¡wDÉí)~
  5381. /* Summary */°dONLNd“Ç¢éÆ(ã¢};°dONLNd’ç~ôä(ñ~};
  5382.     °dONLNdÿ©~¥◊*Field descriptions
  5383. °dONLNdÏ∑~√¸*Version Compare Flags°dONLNd∑¸√˛)~ °dONLNd∑√)=Currently reserved for use by Apple Computer, Inc.  (2-bytes)ˇ dˇ ˇˇˇˇd
  5384. d, Palatino
  5385. .+~*C  H  A  P  T  E  R      3,     Helvetica
  5386.     *Packages and Atoms(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú78,
  5387. Courier
  5388. °dONLNdQ~]2(Z~Version Compare Code Rsrc Type°dONLNd\h+ê ;The resource type of the Version Compare code resource.  (4°dONLNdZ\h(e-°dONLNd[ht*(qbytes)°dONLNdb|~à&(Ö~Version Compare Code Rsrc ID°dONLNdáì-+ê @The resource ID of the Version Compare code resource.  (2-bytes)°dONLNd¿õ~ß(§~Minimal Required Memory°dONLNdÿõß)ê9The minimum number of free bytes the Version Compare code°dONLNdß≥»* +resource needs during execution.  (4-bytes)
  5389.     °dONLNdBΩ»**NOTE
  5390. °dONLNdKÀ◊*;Unless your Version Compare routine has a special need for °dONLNdä◊„!* <it's own memory heap, you should always assign this field a °dONLNd „Ô* :value of zero. A value of zero allows the Version Compare °dONLNdÔ˚„* 0routine to use the Installer’s allocated memory.,
  5391.  
  5392. Zapf Dingbats
  5393.     °dONLNd8Ò„˙Í)’u
  5394. °dONLNd:~( ~Version Compare Summary°dONLNdR.)êAAn optional string briefly describing the purpose of this Version°dONLNdî* >Compare function.  This string is never displayed to the user.°dONLNd‘'é* (even-padded Pascal string)ˇ dˇ ˇˇˇˇd
  5395. d, Palatino
  5396. .+~-C  H  A  P  T  E  R      4,     Helvetica
  5397.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú79
  5398. $°dONLNdQ~y`(o~Installer Rules"°∂ 40°∂°∂
  5399. °dONLNd~**∏XThis chapter describes how to use Frameworks, Rules and Rule Clauses to make intelligent°dONLNdi*~69* )installation recommendations to the user.
  5400. °dONLNdîN6b”(]6Frameworks (‘infr’)"°∂ b4b0°∂°∂
  5401. °dONLNd®g~s+HX Rules are evaluated when the Installer is launched; and, when needed, while the user is°dONLNds~    * interacting with the interface.°dONLNd!á~ì*Times when rules are evaluated:,
  5402.  
  5403. Zapf Dingbats
  5404.     °dONLNdBù~¶Ö*n
  5405. °dONLNdDõêß')\The rules are first evaluated immediately after the user dismisses the splash screen.  If no°dONLNd°ßê≥* Ysplash screen is provided, then before showing the Easy Install or Custom Install dialog.
  5406.     °dONLNd˚Ω~ΔÖ(ƒ~n
  5407. °dONLNd˝ªê«)YThe user selects a different target disk, application folder or system disk while in Easy°dONLNdW«ê”* Install or Custom Install.
  5408.     °dONLNdr›~ÊÖ(‰~n
  5409. °dONLNdt€êÁ)XThe user returns to the Installer from another application when running in a MultiFinder°dONLNdÕÁêÛÀ* environment.
  5410.     °dONLNd⁄˝~Ö(~n
  5411. °dONLNd‹˚ê!)\The currently selected target disk changes because the user clicks the Eject Disk button, or°dONLNd9ê* Yinserts a disk, or the disk goes offline because of a network failure or system activity.
  5412. °dONLNdì'~6(2~Global Rule Framework"°∂ 5|50°∂°∂
  5413. °dONLNd©:~F!*ZThe global framework provides common rules between the custom install and the easy install°dONLNdF~R"* [frameworks.  The global framework will always be executed before the easy install or custom°dONLNd`R~^** ^install frameworks.  It allows smaller and simpler scripts by allowing the other frameworks to°dONLNdø^~j* ^refer to assertions set in the global framework.  All rule clauses can be called in the global°dONLNdj~v$* ]framework, but those not relevant to the interface mode are ignored.  The global framework is°dONLNd|v~ÇY* 4located by looking for an ‘infr’ resource of ID 765.
  5414. °dONLNd≥ñ~•0*"Easy Install Rule Framework"°∂ §|§0°∂°∂
  5415. °dONLNdœ©~µ*ZThe Easy Install rule framework provides control over the message area in the Easy Install°dONLNd*µ~¡-* `screen.  When the Installer finds and opens the script, the Easy framework is located by looking°dONLNdã¡~Õ* afor an ‘infr’ resource that does not have the ID of 765 or 766.  This is to provide compatibilityˇŒdˇ ˇˇˇˇd
  5416. d, Palatino
  5417. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5418.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú80
  5419. °dONLNdQ~]((Z~cwith Installer 3.4.X scripts that can use any ID for their ‘infr’ resource.  It is recommended that°dONLNdd]~iY* /the Easy framework resource have the ID of 764.
  5420. °dONLNdî}~åB*"Custom Install Rule Framework"°∂ ã|ã0°∂°∂
  5421. °dONLNd≤ê~ú-*_The Custom Install rule framework provides control over items shown in the Custom Install list.°dONLNdú~®(* ^When the Installer finds and opens the script, a Custom framework is located by looking for an°dONLNdr®~¥
  5422. * _‘infr’ resource of ID 766.  If one is not found, the Installer uses the Installer 3.X method of°dONLNd“¥~¿√* Fdetermining which packages should be shown in the Custom Install list.°dONLNd»~‘+*_When a Custom Install framework is found in the script, the scriptwriter must call the new rule°dONLNdy‘~‡ú* clause ,
  5423. Courier°dONLNdÄ‘ú‡Í)
  5424. AddCustomItem°dONLNdç‘͇))NI for each top-level item to be displayed in the Custom Install list.  The°dONLNd◊‡~ÏÃ(È~
  5425. AddCustomItem°dONLNd‰‡ÃÏ*)NR rule clause accepts a list of the package (‘inpk’) IDs.  The items will be listed°dONLNd7Ï~¯m(ı~4in the order they are added.  Sub-packages with the °dONLNdkÏm¯ª)Ô
  5426. showsOnCustom°dONLNdxϪ¯ı)N flag set will°dONLNdá¯~(~Yautomatically be added at the appropriate levels in the hierarchical Custom Install list.°dONLNd· ~*ZLike the Easy Install framework, the Custom Install framework executes every time the user°dONLNd<~$* ]switches to Custom Install, changes the target disk/folder selection, or brings the Installer°dONLNdö$~0¶* forward.
  5427. °dONLNd•H6\õ(W6Rules (‘inrl’)"°∂ \4\0°∂°∂
  5428. °dONLNd¥a~m+HYRules, which are organized by the rule framework, provide the intelligence for making the°dONLNdm~yˇ* VEasy Install interface possible.  Rules can examine the installation environment, save°dONLNdey~Ö(* ^information about the installation environment to simplify other rules, provide information to°dONLNdƒÖ~ë * \the user about what the Easy Install will do for them, report errors, and/or determine which°dONLNd!ë~ù[* 2packages will be used in the Easy Install process.°dONLNdT•~±)*bRules are composed of one or more clauses.  Each clause returns a boolean value.  The first clause°dONLNd∑±~ΩŒ* Mthat returns FALSE terminates the rule.  If the terminated rule is part of a °dONLNd±ŒΩ(∫Œ    pickFirst°dONLNd
  5429. ±Ω)6 set in°dONLNdΩ~…$(Δ~bthe rule framework then the following rule, if any, is evaluated.  If all of the clauses in a rule°dONLNdx…~’õ* return °dONLNd…õ’≥)TRUE°dONLNdÉ…≥’†)=, the rule is said to fire.  If the firing rule is part of a °dONLNd¿…†’÷)Ì    pickFirst°dONLNd……÷’)6 set in the rule°dONLNd⁄’~·t(fi~6framework then no more rules in the set are evaluated.°dONLNdÈ~ı)*_Clauses can be combined to develop the equivalent of an if-then statement.  For example, the if°dONLNdpÈ)ı-(Ú)-°dONLNdqı~≈(˛~then statement:°dONLNdÅ~\*%IF the chosen target is a floppy disk°dONLNd®~Ê* <THEN use the package named floppyInstall in the Easy Install°dONLNdÂ)~5b*&would be written as a rule as follows:°dONLNd     B~NJ*"resource 'inrl' (rFloppyInstall) {°dONLNd    0MêYÃ+
  5430. format0 {{°dONLNd    =X¢dh+ !checkTgtVolSize {floppy, floppy},°dONLNd    _Xzd¥)ÿ <-- A Clause°dONLNd    nd¢pV(m¢addPackages {{pFloppyInstall}}°dONLNd    édzp“)ÿ<-- Another Clause°dONLNd    ¢pê|¢(yê}};°dONLNd    ¶{~áä(Ñ~};°dONLNd    ©ï~°+*'The scriptwriter defines the constants °dONLNd    –ï+°)≠rFloppyInstall°dONLNd    fiï°î)T and °dONLNd    „ïî°Ë)pFloppyInstall°dONLNd    Òï˰')T earlier in the°dONLNd
  5431. °~≠Ÿ(™~script (for example: °dONLNd
  5432. °Ÿ≠{)[#define rFloppyInstall 1000°dONLNd
  5433. 1°{≠&)¢)).  This rule has two clauses.  The first°dONLNd
  5434. [≠~πü(∂~clause, °dONLNd
  5435. c≠üπ˘)!checkTgtVolSize°dONLNd
  5436. r≠˘π)Z     returns °dONLNd
  5437. {≠π4)#TRUE°dONLNd
  5438. ≠4π)7 if the currently chosen target volume is a floppy.  If°dONLNd
  5439. ∑π~≈ÿ(¬~checkTgtVolSize°dONLNd
  5440. Δπÿ≈˚)Z     returns °dONLNd
  5441. œπ˚≈)#TRUE°dONLNd
  5442. ”π≈¸)6, the second clause is evaluated.  This second clause,°dONLNd
  5443. ≈~—¿(Œ~ addPackages°dONLNd ≈¿—
  5444. )B, always returns °dONLNd &≈
  5445. —")JTRUE°dONLNd *≈"—));, but also has the effect of adding the package whose ID isˇ∫dˇ ˇˇˇˇd
  5446. d, Palatino
  5447. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5448.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú81,
  5449. Courier
  5450. °dONLNdQ~]“(Z~pFloppyInstall°dONLNdQ“]*)TT to the list of packages to be used in the Easy Install.  So, if the first clause is°dONLNdc]~iñ(f~TRUE°dONLNdg]ñi´)=, the addPackages clause will be TRUE and the rule will fire.°dONLNd•q~}¿(z~Clauses can be °dONLNd¥q¿}“)BAND°dONLNd∑q“}è)*ed together.  For example, we could write:°dONLNd‚Å~ç\(ä~%IF the chosen target is a floppy disk°dONLNd    åêòJ+ AND we are installing on a Mac+°dONLNd)ó~£‡(†~;THEN return the package named floppyInstall to Easy Install°dONLNdf¢êÆ˛+ =AND add “• Mac+ Floppy Installation” to the Easy Install text°dONLNd§ª~«ä(ƒ~as°dONLNdß‘~‡J*"resource 'inrl' (rFloppyInstall) {°dONLNdÀflêÎÃ+
  5451. format0 {{°dONLNdÿÍ¢ˆh+ !checkTgtVolSize {floppy, floppy},°dONLNd¸ı¢⁄* 4checkGestalt {gestaltMachineType, {gestaltMacPlus}},°dONLNd3¢ \* addPackages {{pFloppyInstall}},°dONLNdU ¢»* 1addUserDescription {'• Mac+ Floppy Installation'}°dONLNdàê"¢(ê}};°dONLNdå!~-ä(*~};°dONLNdè;~GY*5This rule has four clauses.  If the first two return °dONLNdƒ;YGq)€TRUE°dONLNd»;qG))+ (i.e., we are installing onto a floppy and°dONLNdÙG~S(P~\the current machine is a Mac Plus) then the second two clauses will be evaluated.  Note that°dONLNdQS~_≤* the clauses °dONLNd]S≤_Ù)4 addPackages°dONLNdhSÙ_    )B and °dONLNdmS    _u)addUserDescription°dONLNdSu_∏)l always return °dONLNdéS∏_–)CTRUE°dONLNdíS–_”).°dONLNdîg~s(p~ZFor a more complete example, suppose you wanted to add a piece of text to the Easy Install°dONLNdÔs~&* ]message which described the machine you were installing onto.  The pseudo code is as follows:°dONLNdMÉ~è*IF (Machine=Plus) THEN°dONLNdeéêö‡+ 8Return the message 'Installing onto your Macintosh Plus'°dONLNdûô~•(¢~ELSE IF (Machine=SE) THEN°dONLNd∫§ê∞Œ+ 5Return the message 'Installing onto your Macintosh SE°dONLNdØ~ª(∏~ELSE IF (Machine=II) THEN°dONLNd ∫êΔ‘+ 6Return the message 'Installing onto your Macintosh II'°dONLNdB◊~„(‡~!The rule framework is as follows:°dONLNddÁ~Ûû*0resource 'infr' (kEasyInstallFrameworkRsrcID ) {°dONLNdñÚê˛Ã+
  5452. format0 {{°dONLNd£˝¢    t+ #pickFirst, {rPlusUD, rSEUD, rIIUD},°dONLNd»êú(ê}}°dONLNdÀ~ä(~};°dONLNdŒ-~9Ñ*9The rules which this framework references are as follows:°dONLNd=~I *resource 'inrl' (rPlusUD) {°dONLNd%HêTÃ+
  5453. format0 {{°dONLNd2S¢_⁄+ 4checkGestalt {gestaltMachineType, {gestaltMacPlus}},°dONLNdi^¢j˛* :addUserDescription {'Installing onto your Macintosh Plus'}°dONLNd•iêu¢(rê}};°dONLNd©t~Ää(}~};°dONLNd¨ä~ñ*resource 'inrl' (rSEUD) {°dONLNd«ïê°Ã+
  5454. format0 {{°dONLNd‘†¢¨Œ+ 2checkGestalt {gestaltMachineType, {gestaltMacSE}},°dONLNd    ´¢∑Ï* 7addUserDescription {'Installing onto your Macintosh SE}°dONLNdB∂ꬢ(øê}};°dONLNdF¡~Õä( ~};°dONLNdI◊~„*resource 'inrl' (rIIUD) {ˇ
  5455. dˇ ˇˇˇˇd
  5456. d, Palatino
  5457. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5458.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú82,
  5459. Courier
  5460. °dONLNdQê]Ã(Zê
  5461. format0 {{°dONLNd
  5462. \¢hŒ+ 2checkGestalt {gestaltMachineType, {gestaltMacII}},°dONLNdBg¢sÏ* 7addUserDescription {'Installing onto your Macintosh II}°dONLNd{rê~¢({ê}};°dONLNd}~âä(Ü~};°dONLNdÇó~£¿*The constants, °dONLNdëó¿£)BrPlusUD, rSEUD°dONLNdüó£,)T, and °dONLNd•ó,£J)rIIUD°dONLNd™óJ£#)2 would be defined in the script before being used.
  5463. °dONLNd›∑~ΔÁ(¬~Using Assertions"°∂ ≈|≈0°∂°∂
  5464. °dONLNdÓ ~÷#*bIt is often useful to keep track of information about the type of installation that is being done.°dONLNdR÷~‚&* aThis allows a more natural script organization.  Note:  The Installer clears all assertions prior°dONLNd¥‚~Ó* ^to firing rules.  Suppose, for example, that many of the rules in a script depended on knowing°dONLNdÓ~˙* Zwhether an update or a new install was being done.  The pseudocode for this is as follows:°dONLNdn˛~
  5465. ¸*IF System File Exists°dONLNdÖ    ê+ AND Installing on Mac+°dONLNdú~ ,(~THEN Use Mac+ Update packages°dONLNd∫*~6¸*IF System File Exists°dONLNd—5êA+ AND Installing on MacSE°dONLNdÈ@~L2(I~THEN Use MacSE Update packages°dONLNdZ~f_*0More conveniently (and with better performance):°dONLNd9j~v¸*IF System File Exists°dONLNdOu~Ÿ* THEN Assert(updating)°dONLNdeã~ó¿* IF updating°dONLNdrñê¢+ AND Installing on Mac+°dONLNdâ°~≠,(™~THEN Use Mac+ Update packages°dONLNdß∑~√¿* IF updating°dONLNd¥¬êŒ+ AND Installing on MacSE°dONLNdÃÕ~Ÿ2(÷~THEN Use MacSE Update packages°dONLNdÎÁ~Û*^Assertions provide this functionality.  Using assertions is a three-step process:  1) define a°dONLNdJÛ~ˇê* Aunique constant for the assertion, 2) set the assertion using an °dONLNdãÛêˇÿ(¸ê AddAssertion°dONLNdóÛÿˇ)H clause, and 3)°dONLNdߡ~ Ì(~check the assertions via °dONLNd¿ˇÌ À)o%CheckAllAssertions, CheckAnyAssertion°dONLNd¡À Œ)fi,°dONLNdÁ ~∂(~4CheckMoreThanOneAssertion, CheckAllNonAssertions, or°dONLNd~"ˆ* CheckAnyNonAssertion°dONLNd0ˆ"ÿ)x3 clauses.  The above example is written as follows:°dONLNdd&~2‰(/~#define aUpdating°dONLNdv&Í2)l1°dONLNdÄ&å2È)¢<-- uniquely defined°dONLNdï=~Iò(F~/resource 'infr' (kEasyInstallFrameworkRsrcID) {°dONLNdΔHêTÃ+
  5466. format0 {{°dONLNd”S¢_∂+ .pickAll, {rCheckUpdate, rSEUpdate, rIIUpdate},°dONLNd^êjú(gê}}°dONLNdi~uä(r~};°dONLNd    ~ã>* resource 'inrl' (rCheckUpdate) {°dONLNd+äêñÃ+
  5467. format0 {{°dONLNd8å+ 'checkFileRsrcForkExists {fsSystemFile},°dONLNdb†¢¨>* addAssertion {{aUpdating}}°dONLNdņ娥)Í
  5468. <-- set it°dONLNdç¨ê∏¢(µê}};°dONLNdë∑~√ä(¿~};°dONLNdîÕ~Ÿ,*resource 'inrl' (rSEUpdate) {ˇÿdˇ ˇˇˇˇd
  5469. d, Palatino
  5470. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5471.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú83,
  5472. Courier
  5473. °dONLNdQê]Ã(Zê
  5474. format0 {{°dONLNd
  5475. \¢h\+ checkAllAssertions {aUpdating},°dONLNd/\åh¡)Í <-- check it°dONLNd>h¢tŒ(q¢2checkGestalt {gestaltMachineType, {gestaltMacSE}},°dONLNdss¢8* addPackages {{pSEUpdate}}°dONLNdé~êä¢(áê}};°dONLNdíâ~ïä(í~};°dONLNdïü~´,*resource 'inrl' (rIIUpdate) {°dONLNd¥™ê∂Ã+
  5476. format0 {{°dONLNd¡µ¢¡V+ checkAllAssertions {aUpdating}°dONLNd‚µå¡¡)Í <-- check it°dONLNdÒ¡¢ÕŒ( ¢2checkGestalt {gestaltMachineType, {gestaltMacII}},°dONLNd&âÿ8* addPackages {{pIIUpdate}}°dONLNdA◊ê„¢(‡ê}};°dONLNdE‚~Óä(Î~};
  5477. °dONLNdH6Ù(6Rule Clause Reference"°∂ 40°∂°∂
  5478. °dONLNd^~&Z+H2This section describes the available rule clauses.°dONLNdë*~6V*$#define kEasyInstallFrameworkRsrcID °dONLNd∂*h6z)Í764°dONLNd∫5~Ab(>~&#define kCustomInstallFrameworkRsrcID °dONLNd·5hAz)Í766°dONLNdÂ@~L8(I~#define kGlobalFrameworkRsrcID °dONLNd@hLz)Í765
  5479. °dONLNd [6k∂(g6Global Rule Clauses
  5480. °dONLNdÄ6é~*# CheckGestalt"°∂ k4k0°∂°∂"°∂ é4é0°∂°∂
  5481. °dONLNd,£~؇+H";CheckGestalt { gestaltSelector, {gestaltReturnValuesList} }°dONLNdhΩ~…®*gestalt°dONLNdoΩ®…Æ)*S°dONLNdpΩÆ…ÿ)elector°dONLNdxΩ… )`=A selector value specifying the type of system information to°dONLNd∂…’X* check.  (4-bytes)°dONLNd»›~È(Ê~gestaltReturnValuesList°dONLNd‡›È,)êBA list of Gestalt return values. If the Gestalt result matches one°dONLNd#Èı* <of the values in the list the function will return TRUE.  (4°dONLNd_Èı(Ú-°dONLNd`ı*(˛bytes)
  5482.     °dONLNdg
  5483. 6s(6 DESCRIPTION
  5484. °dONLNds~(£+HUse the °dONLNd{£(Î)% CheckGestalt°dONLNdáÎ(:)H clause to check a °dONLNdö:(d)OGestalt°dONLNd°d(ñ)*
  5485.  attribute.  °dONLNdÆñ(fi)2 CheckGestalt°dONLNd∫fi( )H
  5486.  takes two°dONLNd≈(~4ª(1~arguments:  a °dONLNd”(ª4Â)=Gestalt°dONLNd⁄(Â4c)* selector, and a list of valid °dONLNd˘(c4ç)~Gestalt°dONLNd(ç4%)*$ return values.  The Installer calls°dONLNd%4~@®(=~Gestalt°dONLNd,4®@6)*" with the given selector.  If the °dONLNdN46@`)éGestalt°dONLNdU4`@)*, return value is in the list of valid return°dONLNdÇ@~L°(I~values, °dONLNdä@°LÈ)# checkGestalt°dONLNdñ@ÈL )H     returns °dONLNdü@ L$)#TRUE°dONLNd£@$L').
  5487.     °dONLNd•V~aö(^~NOTE
  5488. °dONLNd™d~p*aIf the Gestalt selector specified requires a value containing flags ( or a bit mask ), you should°dONLNd p~|* 8use the CheckGestaltAttributes routine described below. ,
  5489.  
  5490. Zapf Dingbats
  5491.     °dONLNdDr{Ü(yu
  5492. °dONLNdFî6¢∂(û6CheckGestaltAttributes"°∂ ¢4¢0°∂°∂
  5493. °dONLNd]∑~√∞+H"3CheckGestaltAttributes { gestaltSelector, bitMask }ˇDdˇ ˇˇˇˇd
  5494. d, Palatino
  5495. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5496.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú84,
  5497. Courier
  5498. °dONLNdQ~]®(Z~gestalt°dONLNdQ®]Æ)*S°dONLNdQÆ]ÿ)elector°dONLNdQ] )`=A selector value specifying the type of system information to°dONLNdN]iX* check.  (4-bytes)°dONLNd`q~}®(z~bitMask°dONLNdhq})ê:A bit mask that will be AND’ed with actual result from the°dONLNd£}â8* Gestalt°dONLNd™}8â|)* call.  (4-bytes)
  5499.     °dONLNdºï6ûs(ú6 DESCRIPTION
  5500. °dONLNd»§~∞£+HUse the °dONLNd–§£∞')%CheckGestaltAttributes°dONLNdʧ'∞˜)Ñ2 clause to check one or more specific bits in the °dONLNd§˜∞!)–Gestalt°dONLNd ∞~º"(π~_value.  Passing a bit mask with more than one bit set will effectively OR the specified bits in°dONLNdĺ~»Ò* the Gestalt result value.  °dONLNdõºÒ»u)sCheckGestaltAttributes°dONLNd±ºu»‚)Ñ takes two arguments:  a °dONLNd º‚» )mGestalt°dONLNd“»~‘E(—~/selector, and a bit mask.  The Installer calls °dONLNd»E‘o)«Gestalt°dONLNd»o‘ä)* with °dONLNd»ä‘‰)gestaltSelector°dONLNd»‰‘ )Z , then AND’s°dONLNd*‘~‡·(›~the result value with °dONLNd@‘·‡ )cbitMask°dONLNdG‘ ‡ñ)*".  If this value is non-zero then °dONLNdi‘ñ‡)ãCheckGestaltAttributes°dONLNdć~Ïü(È~returns °dONLNdà‡üÏ∑)!TRUE°dONLNdå‡∑Ï∫).
  5501. °dONLNdé6†(6CheckMinMemory"°∂ 40°∂°∂
  5502. °dONLNdù'~38+H"CheckMinMemory{ minimalMemory }°dONLNdΩA~MÃ*
  5503. minimalMemory°dONLNd AÃMŒ)N °dONLNdÃAM)B6The minimal number of megabytes of physical memory. (4°dONLNdAM(J-°dONLNdMY*(Vbytes)
  5504.     °dONLNd
  5505. e6ns(l6 DESCRIPTION
  5506. °dONLNdt~Äë+HUse °dONLNdtëÄÂ)CheckMinMemory°dONLNd(tÂÄ )T? to specify the minimal amount of physical memory needed for an°dONLNdhÄ~å-(â~(installation.  Note that you cannot use °dONLNdêÄ-åu)Ø CheckGestalt°dONLNdúÄuå)H& for this job unless you want to list °dONLNd¬Äå)ôall°dONLNd≈Äå') of°dONLNd…å~òÜ(ï~;the memory configurations applicable for an installation.  °dONLNdåÜò⁄(ïÜCheckMinMemory°dONLNdå⁄ò)T takes a single°dONLNd"ò~§M(°~,argument:  the minimal amount of memory (in °dONLNdNòM§Y)œMB°dONLNdPòY§⁄) ) needed for this clause to be °dONLNdoò⁄§Ú)ÅTRUE°dONLNdsòÚ§ı).
  5507. °dONLNduº6 ø(Δ6CheckFileDataForkExists"°∂  4 0°∂°∂
  5508. °dONLNdçfl~Îò+H"/CheckFileDataForkExists{ targetFileSpecRsrcID }°dONLNdΩ˘~ˆ*targetFileSpecRsrcID°dONLNd—˘ˆ¯)x °dONLNd”˘Δ)*A Target File Spec resource ID.  (2-bytes)
  5509.     °dONLNd˛6s(6 DESCRIPTION
  5510. °dONLNd
  5511.  ~,ë+HUse °dONLNd ë,)CheckFileDataForkExists°dONLNd% ,)ä: to determine whether a specific file has a data fork.  It°dONLNd`,~8Í(5~Ttakes a single argument:  the Target File Spec ID of the file you are interested in.°dONLNdµ8~D* CheckFileDataForkExists°dONLNdÃ8D+)ä     returns °dONLNd’8+DC)#TRUE°dONLNdŸ8CD)3 if the file referenced by the File Spec exists and°dONLNd
  5512. D~P«(M~has a data fork.
  5513. °dONLNdh6væ(r6CheckFileRsrcForkExists"°∂ v4v0°∂°∂
  5514. °dONLNd6ã~óò+H"/CheckFileRsrcForkExists{ targetFileSpecRsrcID }°dONLNdf•~±ˆ*targetFileSpecRsrcID°dONLNdz•ˆ±¯)x °dONLNd|•±Δ)*A Target File Spec resource ID.  (2-bytes)
  5515.     °dONLNdßΩ6Δs(ƒ6 DESCRIPTIONˇîdˇ ˇˇˇˇd
  5516. d, Palatino
  5517. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5518.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú85
  5519. °dONLNdQ~]ë(Z~Use ,
  5520. Courier°dONLNdQë])CheckFileRsrcForkExists°dONLNdQ]%)ä> to determine whether a specific file has a resource fork.  It°dONLNdZ]~i(f~`takes a single argument:  the Target File Spec ID of the file you are interested in.  It returns°dONLNdªi~uñ* TRUE°dONLNdøiñu…)H if the file referenced by the File Spec exists and has a resource fork.°dONLNdu~Å(~~CheckFileRsrcForkExists°dONLNduÅ!)äB is a convenient way to see if a file which contains code exists..
  5521. °dONLNdbô6ß“(£6CheckFileContainsRsrcByID"°∂ ß4ß0°∂°∂
  5522. °dONLNd|º~»Ú+H">CheckFileContainsRsrcByID{ targetFileSpecRsrcID, resourceType,°dONLNdª«~”Δ* resourceID }°dONLNd»·~̈*targetFileSpecRsrcID°dONLNd‹·ˆÌ¯)x °dONLNdfi·ÌΔ)*A Target File Spec resource ID.  (2-bytes)°dONLNd    ı~Δ(˛~ resourceType°dONLNdıΔ»)H °dONLNdıÉ)HA resource type.  (4-bytes)°dONLNd3    ~∫(~
  5523. resourceID°dONLNd=    ∫º)< °dONLNd?    z)TA resource ID.  (2-bytes)
  5524.     °dONLNdY!6*s((6 DESCRIPTION
  5525. °dONLNde0~<++HbMany times it is necessary to determine whether a specific file contains a specific resource.  Use°dONLNd»<~Hê* the °dONLNdÃ<êH&)checkFileContainsRsrcByID°dONLNdÂ<&H&)ñ9 clause to determine whether a file has a resource with a°dONLNdH~T⁄(Q~known type and ID.  °dONLNd3H⁄Tp)\checkFileContainsRsrcByID°dONLNdLHpT')ñ) takes three arguments:  the File Spec ID°dONLNdvT~`µ(]~Iof the target file, the type of the resource, and the ID of the resource.
  5526. °dONLNd¿x6ÜË(Ç6CheckFileContainsRsrcByName"°∂ Ü4Ü0°∂°∂
  5527. °dONLNd‹õ~߲+H"@CheckFileContainsRsrcByName{ targetFileSpecRsrcID, resourceType,°dONLNd¶~≤“* resourceName }°dONLNd,¿~È*targetFileSpecRsrcID°dONLNd@¿ˆï)x °dONLNdB¿ÃΔ)*A Target File Spec resource ID.  (2-bytes)°dONLNdm‘~‡Δ(›~ resourceType°dONLNdy‘Δ‡»)H °dONLNd{‘‡É)HA resource type.  (4-bytes)°dONLNdóË~ÙΔ(Ò~ resourceName°dONLNd£ËΔÙ»)H °dONLNd•ËÙ›)H-A resource name.  (even-padded Pascal string)
  5528.     °dONLNd”6    s(6 DESCRIPTION
  5529. °dONLNdfl~ë+HUse °dONLNd„ë3)checkFileContainsRsrcByName°dONLNd˛3)¢2 to determine whether a file has a resource with a°dONLNd1~'Ê($~known type and name.  °dONLNdGÊ'à)hcheckFileContainsRsrcByName°dONLNdbà')¢! takes three arguments:  the File°dONLNdÑ'~3Ê(0~SSpec ID of the target file, the type of the resource, and the name of the resource.
  5530. °dONLNdÿK6Yö(U6CheckFileVersion"°∂ Y4Y0°∂°∂
  5531. °dONLNdÈn~z+H"CCheckFileVersion{ targetFileSpecRsrcID, majorVersNum, minorVersNum,°dONLNd-y~Ö* releaseStage, releaseNum}°dONLNdGì~üˆ*targetFileSpecRsrcID°dONLNd[ìˆü¯)x °dONLNd]ìüΔ)*A Target File Spec resource ID.  (2-bytes)°dONLNdàß~≥Δ(∞~ majorVersNum°dONLNdîßΔ≥»)H °dONLNdñß≥∞)H$The major version number.  (2-bytes)°dONLNdªª~«Δ(ƒ~ minorVersNum°dONLNd«ªΔ«»)H °dONLNd…ª«±)H$The minor version number.  (2-bytes)ˇ,dˇ ˇˇˇˇd
  5532. d, Palatino
  5533. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5534.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú86,
  5535. Courier
  5536. °dONLNdQ~]Δ(Z~ releaseStage°dONLNd QΔ]»)H °dONLNdQ]!)H?The release stage.  Four release stage constants are defined in°dONLNdN]i)* ?the InstallerTypes.r file:  development, alpha, beta, final and°dONLNdéiu_* release.  (2-bytes)°dONLNd¢}~â∫(Ü~
  5537. releaseNum°dONLNd¨}∫âº)< °dONLNdÆ}âï)TThe release number.  (2-bytes)
  5538.     °dONLNdÕï6ûs(ú6 DESCRIPTION
  5539. °dONLNdŸ§~∞ë+HUse °dONLNd›§ë∞Ò)CheckFileVersion°dONLNḑÒ∞z)`" to check the version of a file.  °dONLNd§z∞⁄)âCheckFileVersion°dONLNd§⁄∞)`
  5540.  takes two°dONLNd*∞~º.(π~carguments:  the filespec ID of the file in question, and the minimal version of the file needed for°dONLNdéº~»»* this clause to be °dONLNd†º»»‡)JTRUE°dONLNd§º‡»ÿ):.  The Installer obtains this information from the file’s °dONLNdfiºÿ»¸)¯'vers'°dONLNd‰º¸»)$ ID =1°dONLNdλ~‘ø(—~resource.  If no °dONLNd¸»ø‘„)A'vers'°dONLNd»„‘*)$ resource exists, °dONLNd»*‘ä)GCheckFileVersion°dONLNd$»ä‘≠)`     returns °dONLNd-»≠‘À)#FALSE°dONLNd2»À‘Œ).°dONLNd4‹~ËË(Â~RFor example, to check for System version 6.0.5 or newer, use the following clause.°dONLNdàÏê¯∞+0checkFileVersion{SysFileSpec, 6, 5, release, 0};°dONLNdπ˚~•(~CTo check for System version 7.1 or newer, use the following clause.°dONLNd˛ ê‘+6checkFileVersion{FinderFileSpec, 7, 0x10, release, 0};°dONLNd5~&ƒ(#~ITo check for AppleTalk version 57.0.4 or newer, use the following clause.°dONLNdÄ*ê6‡+8checkFileVersion{ATalkFileSpec, 0x57, 0x04, release, 0};
  5541. °dONLNdπI6W∑(S6CheckFileCountryCode"°∂ W4W0°∂°∂
  5542. °dONLNdŒl~x‘+H"9CheckFileCountryCode{ targetFileSpecRsrcID, countryCode }°dONLNdÜ~íˆ*targetFileSpecRsrcID°dONLNd܈í¯)x °dONLNdÜíΔ)*A Target File Spec resource ID.  (2-bytes)°dONLNdIö~¶¿(£~ countryCode°dONLNdTö¿¶¬)B °dONLNdVö¶})NA country code.  (2 bytes)
  5543.     °dONLNdq≤6ªs(π6 DESCRIPTION
  5544. °dONLNd}¡~Õ£+HUse the °dONLNdÖ¡£Õ)%CheckFileCountryCode°dONLNdô¡Õ%)x= clause to determine a file’s country code (the name 'country°dONLNd◊Õ~ŸW(÷~2code' has recently been changed to region code).  °dONLNd    ÕWŸœ)ŸCheckFileCountryCode°dONLNdÕœŸ˝)x
  5545.  takes two°dONLNd(Ÿ~ (‚~_arguments: the File Spec ID of the file in question, and the country/region code required.  The°dONLNdàÂ~Ò[* 3Installer obtains this information from the file’s °dONLNdªÂ[Ò)›'vers'°dONLNd¡ÂÒ)$! resource.  The country (MPW 3.1)°dONLNd„Ò~˝“(˙~J/region (MPW 3.2) codes can be found in the MPW interface file SysTypes.r.
  5546. °dONLNd.6#ñ(6CheckTgtVolSize"°∂ #4#0°∂°∂
  5547. °dONLNd>8~DÄ+H"+CheckTgtVolSize{ minimumSize, maximumSize }°dONLNdjR~^¿* minimumSize°dONLNduR¿^¬)B °dONLNdwR^˝)N4The minimum size of the volume in Kbytes.  (4-bytes)°dONLNd¨f~r¿(o~ maximumSize°dONLNd∑f¿r¬)B °dONLNdπfrˇ)N4The maximum size of the volume in Kbytes.  (4-bytes)
  5548.     °dONLNdÓ~6ás(Ö6 DESCRIPTION
  5549. °dONLNd˙ç~ô£+HUse the °dONLNdç£ô˝)%CheckTgtVolSize°dONLNdç˝ô)ZD clause to check target disk size.  Note that this check is for disk°dONLNdVô~•(¢~]size (to distinguish floppy from hard disks), not available disk space.  The Installer itself°dONLNd¥•~± * Xhandles the case where the target has insufficient space to accomplish the installation.°dONLNd±~Ωÿ* CheckTgtVolSize°dONLNd±ÿΩ)ZG takes two arguments: the smallest and largest size disks possible.  To°dONLNdeΩ~…*(Δ~]match any size disk, the minimal and maximal target disk sizes are both zero.  If the minimum°dONLNd√…~’* [size is greater than zero but the maximum size equals zero, only the minimal requirement is°dONLNd    ’~·* ]used.  Note that there are three size pairs defined in InstallerTypes.r.  If you use {floppy,ˇ`dˇ ˇˇˇˇd
  5550. d, Palatino
  5551. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5552.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú87
  5553. °dONLNdQ~](Z~Yfloppy} then checkTgtVolSize will return TRUE for 400 or 800k floppy targets.  If you use°dONLNdZ]~i * R{hdFloppy, hdFloppy} then checkTgtVolSize will return TRUE for high density floppy°dONLNd≠i~u"* [(1.4mb) targets.  If you use {hardDisk, hardDisk} then checkTgtVolSize will return TRUE for°dONLNd    u~Å%* %any target volume of 10mb or greater.
  5554.     °dONLNd/ã~ñö*NOTE
  5555. °dONLNd4ô~•*\Since RAM disks may be most any size, make sure your rules handle this situation correctly. ,
  5556.  
  5557. Zapf Dingbats
  5558.     °dONLNdêõ§#(¢u
  5559. °dONLNdíΩ6À¶(«6CheckRuleFunction"°∂ À4À0°∂°∂,
  5560. Courier
  5561. °dONLNd§‡~ÏÄ+H"+CheckRuleFunction{ ruleFunctionCodeRsrcID }°dONLNd–˙~*ruleFunctionCodeRsrcID°dONLNdÊ˙)Ñ °dONLNdË˙) ?The resource ID of a RuleFunction resource (‘inrf’).  (2-bytes)
  5562.     °dONLNd(6s(6 DESCRIPTION
  5563. °dONLNd4!~-"+H[Rule functions provide you with the ability to extend the rule-based decision-making scheme°dONLNdê-~9π* Gusing a custom code resource written by you or someone else.  When the °dONLNd◊-π9(6πCheckRuleFunction°dONLNdÈ9~E(B~\clause is evaluated the code resource is called and its return result determines whether the°dONLNdFE~Q* clause returns TRUE or FALSE.°dONLNdf[~g"*dTo call a rule function code resource, first create a Rule Function resource (‘inrf’) that describes°dONLNdÀg~s'* ahow to call the code resource.  The Rule Function resource is described in the “InstallerTypes.r”°dONLNd-s~¿* Gfile and the code resource can include the file “RuleFunctionHeader.h”.°dONLNduâ~ïÍ*QWhen the code resource is called, the code resource receives the parameter block:°dONLNd«ô~•fi*typedef struct {°dONLNdŸ§ê∞∫+ ProcPtr°dONLNd„§Í∞P)ZfCallBackProcPtr;°dONLNdˆØêªÆ(∏êshort°dONLNdˇØÍªD)ZfTargetVRefNum;°dONLNd∫êΔ®(√êlong°dONLNd∫ÍΔ\)ZfTargetFolderDirID;°dONLNd-≈ê—Æ(Œêshort°dONLNd6≈Í—D)ZfSystemVRefNum;°dONLNdG–ê‹®(Ÿêlong°dONLNdO–Í‹b)ZfSystemBlessedDirID;°dONLNde€êÁ®(‰êlong°dONLNdm€ÍÁ)ZfRefCon;°dONLNdvÊ~Ún(Ô~(} RuleFunctionPBRec, *RuleFunctionPBPtr;
  5564.     °dONLNdü~
  5565. ö*NOTE
  5566. °dONLNd§~í*The °dONLNd®í˛)fTargetFolderDirID°dONLNd∫˛&)lF field will be -1 if the Installer is using disk mode, the folder does°dONLNd~(¨(%~Fnot exist, or a target File Spec referencing the reserved folder path °dONLNdG¨(Ó(%¨ folder-user°dONLNdRÓ(')B
  5567.  has not been°dONLNd`(~4(1~Zreferenced by in another rule clause prior to calling the CheckRuleFunction rule clause.  
  5568.     °dONLNd∫*3(1u
  5569. °dONLNdæG~So(P~6The code resource should use the function declaration:°dONLNdıW~cñ*long°dONLNd˙W¢cn)$"RuleFunction( RuleFunctionPBPtr );°dONLNdf~r*(o~^The function must return either a TRUE or FALSE value.  Constants for these values are defined°dONLNd|r~~ã* as:°dONLNdÄÇ~é8*#define kTRUERuleFunctionResult°dONLNd†ÇDéJ)Δ1°dONLNd¢ç~ô>(ñ~ #define kFALSERuleFunctionResult°dONLNd√çDôJ)Δ0
  5570. °dONLNd≈©l≥u(±ls
  5571.     °dONLNd«©~¥¡)
  5572. W A R N I N G
  5573. °dONLNd’∑~√*[If you choose to create a sub-heap for each invocation of the Rule Function please read the°dONLNd1√~œ* Ysection “Running with a Sub-Heap” within the Atom Extender portion of this document.  Youˇhdˇ ˇˇˇˇd
  5574. d, Palatino
  5575. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5576.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú88
  5577. °dONLNdQ~](Z~\can enter 0 (zero) in the requested memory field to not create a sub-heap and run inside the°dONLNd]]~i–* Installer’s heap.   ,
  5578.  
  5579. Zapf Dingbats
  5580.     °dONLNdq_–hÿ)Rs
  5581. °dONLNdsÅ6èÑ(ã6 AddAssertion"°∂ è4è0°∂°∂,
  5582. Courier
  5583. °dONLNdħ~∞b+H"&AddAssertion{ { assertionValueList } }°dONLNdßæ~ Í*assertionValueList°dONLNdπæÍ Ï)l °dONLNdªæ ¸)$7A list of 2-byte assertion values that you wish to set.
  5584.     °dONLNdÛ÷6fls(›6 DESCRIPTION
  5585. °dONLNdˇÂ~Ò£+HUse the °dONLNd£ÒÎ)% AddAssertion°dONLNdÂÎÒ®)H0 clause to set a list of 1 or more assertions.  °dONLNdC®Ò)Ω AddAssertion°dONLNdOÂÒ%)H
  5586.  takes a list°dONLNd]Ò~˝¯(˙~Uof assertion constants as arguments.  The constants are uniquely defined Rez symbols.°dONLNd¥˝~    Δ* addAssertion°dONLNd¿˝Δ    
  5587. )H always returns °dONLNd–˝
  5588.     %)GTRUE°dONLNd‘˝%    ().
  5589. °dONLNd÷!6/•(+6CheckAllAssertions"°∂ /4/0°∂°∂
  5590. °dONLNdÈD~PÜ+H",CheckAllAssertions{ { assertionValueList } }°dONLNd^~jÍ*assertionValueList°dONLNd(^ÍjÏ)l °dONLNd*^j    )$9A list of 2-byte assertion values that you wish to check.
  5591.     °dONLNddv6s(}6 DESCRIPTION
  5592. °dONLNdpÖ~ëë+HUse °dONLNdtÖëë˝)CheckAllAssertions°dONLNdÜÖ˝ë)lC to check all of the constants a given list are currently asserted.°dONLNdÀë~ùÍ(ö~CheckAllAssertions°dONLNd›ëÍùø)l2 takes a list of assertion constants as arguments.°dONLNdù~©Í(¶~checkAllAssertions°dONLNd#ùÍ©
  5593. )l     returns °dONLNd,ù
  5594. ©%)#TRUE°dONLNd0ù%©)4 if all of the items in the list have been asserted.
  5595. °dONLNde¡6œ¶(À6CheckAnyAssertion"°∂ œ4œ0°∂°∂
  5596. °dONLNdw‰~Ä+H"+CheckAnyAssertion{ { assertionValueList } }°dONLNd£˛~
  5597. Í*assertionValueList°dONLNdµ˛Í
  5598. Ï)l °dONLNd∑˛
  5599.     )$9A list of 2-byte assertion values that you wish to check.
  5600.     °dONLNdÒ6s(6 DESCRIPTION
  5601. °dONLNd˝%~1ë+HUse °dONLNd%ë1˜)CheckAnyAssertion°dONLNd%˜1Ó)f: to check if one or more constants are currently asserted.°dONLNdN1~=‰(:~CheckAnyAssertion°dONLNd_1‰=Ω)f4 takes a list of assertion constants as arguments.  °dONLNdì1Ω=#)ŸCheckAnyAssertion°dONLNd•=~Iü(F~returns °dONLNd≠=üI∑)!TRUE°dONLNd±=∑I∑)< if one or more of the items in the list have been asserted.
  5602. °dONLNdÓa6o·(k6CheckMoreThanOneAssertion"°∂ o4o0°∂°∂
  5603. °dONLNdÑ~ê∞+H"3CheckMoreThanOneAssertion{ { assertionValueList } }°dONLNd<û~™Í*assertionValueList°dONLNdNûÍ™Ï)l °dONLNdPû™    )$9A list of 2-byte assertion values that you wish to check.
  5604.     °dONLNdä∂6øs(Ω6 DESCRIPTION
  5605. °dONLNdñ≈~—+HCheckMoreThanOneAssertion°dONLNdØ≈—)ñ> is used to detect whether more than one constant in a list of°dONLNdÓ—~›(⁄~#constants are currently asserted.  °dONLNd—›®)îCheckMoreThanOneAssertion°dONLNd*—®›™)ñ °dONLNd+—™›)takes a list of assertionˇXdˇ ˇˇˇˇd
  5606. d, Palatino
  5607. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5608.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú89
  5609. °dONLNdQ~](Z~$constants as arguments, and returns ,
  5610. Courier°dONLNd$Q]4)ûTRUE°dONLNd(Q4])5 if more than one of the constants has been asserted.°dONLNd_]~i(f~CheckMoreThanOneAssertion°dONLNdx]i#)ñ; could be used, for example, to determine whether more than°dONLNd¥i~u(r~`one printer is being installed.  In that case, display a generic message reporting that “printer°dONLNdu~Ş* software” is being installed.
  5611. °dONLNd3ô6ßé(£6ClearAssertions"°∂ ß4ß0°∂°∂
  5612. °dONLNdCº~»t+H")ClearAssertions{ { assertionValueList } }°dONLNdm÷~‚Í*assertionValueList°dONLNd÷Í‚Ï)l °dONLNdÅ÷‚)$9A list of 2-byte assertion values that you wish to clear.
  5613.     °dONLNdªÓ6˜s(ı6 DESCRIPTION
  5614. °dONLNd«˝~    £+HUse the °dONLNdœ˝£    ˝)%ClearAssertions°dONLNdfi˝˝    Œ)Z4 clause to clear a list of one or more assertions.  °dONLNd˝Œ    ()—ClearAssertions°dONLNd"    ~-(~btakes a list of assertion constants as arguments.  The constants are uniquely defined Rez symbols.°dONLNdÜ~!ÿ* ClearAssertions°dONLNdïÿ!)Z always returns °dONLNd•!7)GTRUE°dONLNd©7!:).
  5615. °dONLNd´96Gø(C6CheckAllNonAssertions"°∂ G4G0°∂°∂
  5616. °dONLNd¡\~hò+H"/CheckAllNonAssertions{ { assertionValueList } }°dONLNdÒv~ÇÍ*assertionValueList°dONLNdvÍÇÏ)l °dONLNdvÇ    )$9A list of 2-byte assertion values that you wish to check.
  5617.     °dONLNd?é6ós(ï6 DESCRIPTION
  5618. °dONLNdKù~©ë+HUse °dONLNdOùë©)CheckAllNonAssertions°dONLNddù©)~= to check all of the constants a given list are currently not°dONLNd¢©~µ´(≤~ asserted.  °dONLNd≠©´µ))-CheckAllNonAssertions°dONLNd¬©)µ˛)~2 takes a list of assertion constants as arguments.°dONLNdˆµ~¡¸(æ~CheckAllNonAssertions°dONLNd µ¸¡)~     returns °dONLNdµ¡7)#TRUE°dONLNdµ7¡)2 if all of the items in the list are not currently°dONLNdK¡~Õß( ~    asserted.
  5619. °dONLNdUÂ6Û¿(Ô6CheckAnyNonAssertion"°∂ Û4Û0°∂°∂
  5620. °dONLNdj~í+H".CheckAnyNonAssertion{ { assertionValueList } }°dONLNdô"~.Í*assertionValueList°dONLNd´"Í.Ï)l °dONLNd≠".    )$9A list of 2-byte assertion values that you wish to check.
  5621.     °dONLNdÁ:6Cs(A6 DESCRIPTION
  5622. °dONLNdÛI~Uë+HUse °dONLNd˜IëU    )CheckAnyNonAssertion°dONLNd I    U)x> to check if one or more constants are currently not asserted.°dONLNdKU~aˆ(^~CheckAnyNonAssertion°dONLNd_UˆaÀ)x2 takes a list of assertion constants as arguments.°dONLNdìa~mˆ(j~CheckAnyNonAssertion°dONLNdßaˆm)x     returns °dONLNd∞am1)#TRUE°dONLNd¥a1m"): if one or more of the items in the list are currently not°dONLNdÔm~yß(v~    asserted.
  5623. °dONLNd˘ë6üÉ(õ6 AddAuditRec"°∂ ü4ü0°∂°∂
  5624. °dONLNd¥~¿∂+H"4AddAuditRec{ targetFileSpecRsrcID, selector, value }°dONLNd:Œ~⁄ˆ*targetFileSpecRsrcID°dONLNdNŒˆ⁄¯)x °dONLNdPŒ⁄Δ)*A Target File Spec resource ID.  (2-bytes)ˇödˇ ˇˇˇˇd
  5625. d, Palatino
  5626. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5627.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú90,
  5628. Courier
  5629. °dONLNdQ~]Æ(Z~selector°dONLNd    Q]u)êThe selector.  (4-bytes)°dONLNd"e~qú(n~value°dONLNd'eúqû) °dONLNd)eqi)rThe value  (4-bytes)
  5630.     °dONLNd>}6Üs(Ñ6 DESCRIPTION
  5631. °dONLNdJå~òí+HThe °dONLNdNåíò‘) AddAuditRec°dONLNdYå‘ò‚)BB clause is used to add a record to a target file’s audit record.  °dONLNdõå‚ò$(ï‚ AddAuditRec°dONLNdßò~§((°~btakes three arguments:  a File Spec ID for the target file, an audit selector, and an audit value.
  5632. °dONLNd
  5633. º6 •(Δ6CheckAnyAuditRec"°∂  4 0°∂°∂
  5634. °dONLNdfl~Î"+H"FCheckAuditRec{ targetFileSpecRsrcID, auditSelector, {auditValueList} }°dONLNdb˘~ˆ*targetFileSpecRsrcID°dONLNdv˘ˆ¯)x °dONLNdx˘Δ)*A Target File Spec resource ID.  (2-bytes)°dONLNd£
  5635. ~Ã(~
  5636. auditSelector°dONLNd±
  5637. u)êThe selector.  (4-bytes)°dONLNd !~-“(*~auditValueList°dONLNdÿ!“-‘)T °dONLNd⁄!-u)<A list of 4-byte values.
  5638.     °dONLNdÛ96Bs(@6 DESCRIPTION
  5639. °dONLNdˇH~Tí+HThe °dONLNdHíTÚ)CheckAnyAuditRec°dONLNdHÚT&)`D clause is used to determine whether a given selector and value have°dONLNdXT~`È(]~Tbeen entered into the audit record of a target file (specified by the File Spec ID).°dONLNdÆ`~lfi* CheckAnyAuditRec°dONLNdæ`fil)`E takes three arguments:  a File Spec ID for the target file, an audit°dONLNdl~x(u~aselector, and a list of audit values.  If the value found in the audit resource for the specified°dONLNdfx~ѧ* Dselector is contained in the list of values the clause returns TRUE.
  5640. °dONLNd´ú6™é(¶6ReportVolError"°∂ ™4™0°∂°∂
  5641. °dONLNd∫ø~À,+H"ReportVolError{ errorString }°dONLNdÿŸ~¿* errorString°dONLNd„Ÿ¿¬)B °dONLNd٦)N#String to display.  (Pascal String)
  5642.     °dONLNd    Ò6˙s(¯6 DESCRIPTION
  5643. °dONLNd˛~
  5644. “+HReportVolError°dONLNd#˛“
  5645. )TL is used to report an error because of a problem with the target disk (not a°dONLNdp
  5646. ~(~<hard disk, disk size too small, no system, et cetera).  The °dONLNd¨
  5647. ”(ReportVolError°dONLNd∫
  5648. ” )T clause reports an°dONLNdÕ~"•(~Cerror message in the Easy Install or Custom Install message area.  °dONLNd•"˘(•ReportVolError°dONLNd˘")T always°dONLNd&"~.ü(+~returns °dONLNd."ü.∑)!TRUE°dONLNd2"∑.)U, so it can be called multiple times in a script.  Messages are concatenated, just as°dONLNdà.~:ó(7~with °dONLNdç.ó:)addUserDescription°dONLNdü.:§)l'.  Up to four lines can be displayed.  °dONLNdΔ.§:¯)°ReportVolError°dONLNd‘.¯:)T takes a°dONLNd›:~F(C~[single even-padded Pascal string as an argument.  To insert the name of the volume into the°dONLNd9F~R* string, place the characters "°dONLNdWFR
  5649. )É^O°dONLNdYF
  5650. Rq) " in the desired place.°dONLNdsZ~f˚(c~If the Installer evaluates a °dONLNdêZ˚fO)}ReportVolError°dONLNdûZOf*)T2 clause, the Easy Install or Custom Install dialog°dONLNd—f~r(o~`displays a caution icon, and the Install button is dimmed.  If you use this clause, the user can°dONLNd2r~~›* still switch volumes.
  5651.     °dONLNdHà~ìö*NOTE
  5652. °dONLNdMñ~¢*WCalling ReportVolError from within the global framework may not work correctly for some°dONLNd•¢~Æ* \scripts.  Depending on the rules within the easy or custom framework, the Install button may°dONLNdÆ~∫)* _still be enabled.  To solve this, call ReportVolError from within the easy or custom framework.,
  5653.  
  5654. Zapf Dingbats
  5655.     °dONLNdb∫~√Ö*
  5656. uˇÚdˇ ˇˇˇˇd
  5657. d, Palatino
  5658. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5659.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú91
  5660. °dONLNdQ6_ã([6ReportSysError"°∂ _4_0°∂°∂,
  5661. Courier
  5662. °dONLNdt~Ä,+H"ReportSysError{ errorString }°dONLNd-é~ö¿* errorString°dONLNd8é¿ö¬)B °dONLNd:éö¶)N#String to display.  (Pascal String)
  5663.     °dONLNd^¶6Øs(≠6 DESCRIPTION
  5664. °dONLNdj≥~ø“+HReportSysError°dONLNdx≥“ø&)TN is used to report an error because of a problem with the system the Installer°dONLNd«ø~À™(»~Dis running on (usually unsupported hardware or a fatal error).  The °dONLNd ø™À˛(»™ReportSysError°dONLNdø˛À)T clause°dONLNd!À~◊(‘~^reports an error message to the Easy Install or Custom Install screen, which ever shows first.°dONLNdÅ◊~„“* ReportSysError°dONLNdè◊“„)T always returns °dONLNdü◊„1)GTRUE°dONLNd£◊1„-)=, so it can be called multiple times in a script.  Up to four°dONLNd·„~Ôú(Ï~Alines can be displayed.  Messages are concatenated, just as with °dONLNd"„úÔ(ÏúAddUserDescription°dONLNd4„Ô )l.°dONLNd7Ô~˚“(¯~ReportSysError°dONLNdEÔ“˚)TK takes a single even-padded Pascal string as an argument.  If the Installer°dONLNdë˚~µ(~ evaluates a °dONLNdù˚µ    )7ReportSysError°dONLNd´˚    )T= clause, the Easy Install or Custom Install dialog displays a°dONLNdÈ~#(~bcaution icon, and the Install button is dimmed.  If you use this clause, the user cannot switch or°dONLNdL~†* Ceject volumes from the interface and has only one option:  to quit.
  5665. °dONLNdê36C‘(?6Easy Install Rule Clauses
  5666. °dONLNd™X6f~*# AddPackages"°∂ C4C0°∂°∂"°∂ f4f0°∂°∂
  5667. °dONLNd∂{~á\+H"%AddPackages{ { assertionValueList } }°dONLNd‹ï~°Ã*
  5668. packageIDList°dONLNdÈïðŒ)N °dONLNdÎï°⁄)B/A list of 2-byte package resource (‘inpk’) IDs.
  5669.     °dONLNd≠6∂s(¥6 DESCRIPTION
  5670. °dONLNd'º~»í+HThe °dONLNd+ºí»‘) AddPackages°dONLNd6º‘»˛)BG clause is used to return a set of packages to the Easy Install screen.°dONLNd»~‘¿(—~ AddPackages°dONLNd仿‘)BI can be called multiple times from a script, and the packages are unioned°dONLNd‘‘~‡¨(›~ together.  °dONLNdfl‘¨‡Ó). AddPackages°dONLNd͑Ӈ´)B, takes a list of package IDs as arguments.  °dONLNd‘´‡Ì)Ω addPackages°dONLNd!‘̇)B always°dONLNd)‡~Ïü(È~returns °dONLNd1‡üÏ∑)!TRUE°dONLNd5‡∑Ï∫).
  5671. °dONLNd76®(6AddUserDescription"°∂ 40°∂°∂
  5672. °dONLNdJ'~3P+H"#AddUserDescription{ messageString }°dONLNdnA~M“*messageString °dONLNd}AM¶)ê#String to display.  (Pascal String)
  5673.     °dONLNd°Y6bs(`6 DESCRIPTION
  5674. °dONLNd≠h~të+HUse °dONLNd±hët˝)AddUserDescription°dONLNd√h˝t)l> to add to the text which is shown in the Easy Install dialog.°dONLNdt~ÄÍ(}~AddUserDescription°dONLNdtÍÄ-)lI takes a single even-padded Pascal string as an argument.  The text to be°dONLNd_Ä~å»(â~Fadded is appended to whatever text has been previously added using the°dONLNd¶å~òÍ* AddUserDescription°dONLNd∏åÍòß)l- clause.  Up to four lines can be displayed. °dONLNdÂåßò)Ω AddUserDescription°dONLNd˘ò~§√(°~always returns °dONLNdò√§€)ETRUE°dONLNd ò€§")J.  Note that the Installer will not supply introductory information so you°dONLNdW§~∞˚(≠~need to say something like: °dONLNds§˚∞fl)}&“Click the Install button to install\n°dONLNdô§fl∞)‰
  5675. {your product°dONLNdß∞~ºÕ(π~here}.”  Use the "°dONLNdπ∞ÕºŸ)O\n°dONLNdª∞Ÿº) F" characters to insert a return character into the description string.ˇTdˇ ˇˇˇˇd
  5676. d, Palatino
  5677. .+~*C  H  A  P  T  E  R      4,     Helvetica
  5678.     *Installer Rules(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú92
  5679. °dONLNdQ6aË(]6Custom Install Rule Clauses
  5680. °dONLNdv6Ñô*#AddCustomItems"°∂ a4a0°∂°∂"°∂ Ñ4Ñ0°∂°∂,
  5681. Courier
  5682. °dONLNd+ô~•Ä+H"+AddCustomItems{ { integer packageRsrcID } }°dONLNdW≥~ø“*packageRsrcID °dONLNdf≥ø()êBA list of 2-byte resource IDs of ‘inpk’ resources to append to the°dONLNd©øÀ≠* %top level of the Custom Install list.
  5683.     °dONLNdœ◊6‡s(fi6 DESCRIPTION
  5684. °dONLNd€Ê~Úí+HThe °dONLNdflÊíÚÊ)AddCustomItems°dONLNdÌÊÊÚ)TC rule clause appends the specified packages to the top level of the°dONLNd1Ú~˛Y(˚~5custom install list regardless of the setting of its °dONLNdfÚY˛ß)€
  5685. showsOnCustom°dONLNdsÚ߲ )N flag.  Each package is°dONLNdã˛~
  5686. Å(~9appended in the order listed.  All sub-packages with the °dONLNdƒ˛Å
  5687. œ(Å
  5688. showsOnCustom°dONLNd—˛œ
  5689. )N
  5690.  flag set are°dONLNdfl
  5691. ~2(~&appended at the appropriate sub-level.ˇ
  5692. dˇ ˇˇˇˇd
  5693. d, Palatino
  5694. .+~6C  H  A  P  T  E  R      5,     Helvetica
  5695.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú93
  5696. $°dONLNdQ~yã(o~File Specification"°∂ 40°∂°∂
  5697. °dONLNd~*+*∏bThis chapter describes how to create the script resources that specify the source and target file.
  5698. °dONLNdvB6V(Q6About File Specifications"°∂ V4V0°∂°∂
  5699. °dONLNdê[~g.+HdMost atoms require a source and target file to be specified in order to carry out the action defined°dONLNdıg~s* \by the atom.  For example, when using a File Atom to copy a file from the source disk to the°dONLNdRs~* btarget disk, a Target File Spec resource (‘intf’) and a Source File Spec resource (‘infs’) must be°dONLNdµ~ãÚ* referenced from the atom.
  5700.     °dONLNdœï~†ö*NOTE
  5701. °dONLNd‘£~Ø"*^When performing installations from some network servers, it is necessary that all source files°dONLNd3Ø~ª,* `have a file creation and modification time stamp that has an even value for the seconds.  If you°dONLNdîª~«* \intend for installation to be performed from network servers you should set the creation and°dONLNdÒ«~”Δ* Lmodification times of all your source files to a value such as 12:00:00 PM. ,
  5702.  
  5703. Zapf Dingbats
  5704.     °dONLNd=…Δ“Õ(–Δu
  5705. °dONLNd?Î6ˇ'(˙6 Specifying Target Files (‘intf’)"°∂ ˇ4ˇ0°∂°∂
  5706. °dONLNd`~+H`The goal of the Target File Spec is to specify where to install the file on the target disk.  In°dONLNd¡~(* `most cases the scriptwriter can hard code the path to the target file using the various reserved°dONLNd"~(›* Rfolder path names, or in special cases, search for the file using a code resource.°dONLNdu0~< *_The path to the target file that must start with a colon or one of two reserved tokens (special°dONLNd‘0 <$(9 -°dONLNd’<~H    (E~Zxxxx or folder-user).  Because the target volume name is not known at the time a script is°dONLNd0H~T$* _written, the scriptwriter supplies a partial path name that begins in the root directory of the°dONLNdêT~`≥* target disk.
  5707. °dONLNdût~É4*"Installing into Special Folders"°∂ Ç|Ç0°∂°∂
  5708. °dONLNdæá~ì*YA scheme is provided to support special folders such as the System Folder, the Apple Menu°dONLNdì~ü* [Folder, and other Folder Manager folders.  The short-hand notation used to specify a folder°dONLNdtü~´‘* manager folder is “,
  5709. Courier°dONLNdáü‘´)V special-xxxx°dONLNdìü´)H8”, where the “xxxx” is one of the defined special folder°dONLNdô~∑(¥~\types. The special folder types currently defined for System 7.0 through 7.1 are as follows:°dONLNd)ø~Àï*Type°dONLNdˇˇ)      °dONLNdˇˇ) °dONLNd/øΔÀ‰)1Folder°dONLNd6À~◊¢(‘~'macs'°dONLNd=ÀΔ◊,)HBlessed System Folderˇ¢dˇ ˇˇˇˇd
  5710. d, Palatino
  5711. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5712.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú94,
  5713. Courier
  5714. °dONLNdQ~]¢(Z~'prnt'°dONLNdQΔ]S)HPrintMonitor Documents Folder°dONLNd%]~i¢(f~'strt'°dONLNd,]Δi    )HStartup Folder°dONLNd;i~u¢(r~'amnu'°dONLNdBiΔu8)HApple Menu Items Folder°dONLNdZu~Å¢(~~'extn'°dONLNdauΔÅ)HExtensions Folder°dONLNdsÅ~ç¢(ä~'pref'°dONLNdzÅΔç)HPreferences Folder°dONLNdçç~ô¢(ñ~'ctrl'°dONLNdîçΔô()HControl Panels Folder°dONLNd™ô~•¢(¢~'font'°dONLNd±ôΔ•~)H)Fonts Folder (applies to System 7.1 only)°dONLNd€≠~π˙(∂~UThis means that if the fully qualified path to the system file on the target disk was°dONLNd1π~≈
  5715. * Q“MyVolume:MyFolder:MySystemFolder:System”, then a reference to the special folder°dONLNdÉ≈~—{* 7“special-macs” would be expanded by the installer to be°dONLNdª—~›.* Z“MyVolume:MyFolder:MySystemFolder.”  For example, if you wanted to install the Finder file°dONLNd›~È(* ]into the blessed folder on the system disk, you would use the path name “special-macs:Finder”°dONLNdtÈ~ı * ^in the File Spec.  If a folder in the path name does not exist, the Installer creates it.  The°dONLNd”ı~* \Installer supports the use of special folders even when running on systems which do not have°dONLNd0~
  5716. * ZFolder Manager functionality.  For more information about the Folder Manager, refer to the°dONLNdã
  5717. ~œ* Finder chapter in °dONLNdù
  5718. œS)QInside Macintosh, Volume VI°dONLNd∏
  5719. SV)Ñ.°dONLNdº!~-+(*~`To support installing into pre-7.0 systems, the Installer will automatically map special folders°dONLNd-~9* ^to the System Folder.  For example, if your target is the Extensions Folder then the Installer°dONLNd|9~E,* _will change the destination to the System Folder rather than create an Extensions Folder.  This°dONLNd‹E~Q$* balso applies to rule clauses that reference a file spec.  While this simplifies script writing for°dONLNd?Q~]’* Nmany files that go into special folders, it does not simplify DA installation.°dONLNdée~q*WLocalized systems are supported through a defined algorithm for determining the correct°dONLNdÊq~},* bspecial folder name by searching for the proper ‘fld#’ resource.  Given a special folder type, the°dONLNdI}~âƒ* LInstaller searches for the type in a ‘fld#’ resource in the following order:,
  5720.  
  5721. Zapf Dingbats
  5722.     °dONLNdñì~úÖ*n
  5723. °dONLNdòëêùÁ)Installer script file
  5724.     °dONLNdÆß~∞Ö(Æ~n
  5725. °dONLNd∞•걉)Target System file
  5726.     °dONLNd√ª~ƒÖ(¬~n
  5727. °dONLNd≈πê≈)Installer application file
  5728.     °dONLNd‡œ~ÿÖ(÷~n
  5729. °dONLNd‚ÕêŸÊ)Booted System file°dONLNdı·~Ì-(Í~dGenerally, the scriptwriter should not include a ‘fld#’ resource in the script so installations into°dONLNdZÌ~˘X* /localized System Folders will happen correctly.
  5730. °dONLNdä
  5731. ~∏*"4Installing into the User-Selected Application Folder"°∂ |0°∂°∂
  5732. °dONLNdø ~,*]The scriptwriter can easily install or remove files and resources from the application folder°dONLNd,~8* \selected by the user.  This reserved folder name should only be used in conjunction with the°dONLNdz8~D* \application folder interface mode.  For example, to install the file “Demo Application” into°dONLNd◊D~PÎ* Mthe application folder the path name might be “folder-user:Demo Application”.
  5733. °dONLNd    %d~s´*"-Managing Rollbacks on Multiple Target Volumes"°∂ r|r0°∂°∂
  5734. °dONLNd    Sw~É#*^With the ability to install onto more than one target volume at a time, a complete rollback is°dONLNd    ≤É~è#* `not possible unless the original files on all target volumes are maintained.  This is not always°dONLNd
  5735. è~õ* [possible due to available disk space on the target volumes.  The Installer always saves the°dONLNd
  5736. oõ~ß+* aoriginal System Folder files on the boot volume, but makes the saving of all other original files°dONLNd
  5737. —ß~≥)* _optional based on the amount of available disk space on each target volume.  If there is enough°dONLNd 1≥~ø* ^space to save all original files on all target volumes the ‘Cancel’ button shows in the Status°dONLNd êø~ÀÎ* Qdialog thereby allow for a complete rollback, otherwise a ‘Stop’ button is shown.ˇ^dˇ ˇˇˇˇd
  5738. d, Palatino
  5739. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5740.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú95
  5741. °dONLNdQ~`T(\~$Installing onto the Installer Volume"°∂ _|_0°∂°∂
  5742. °dONLNd%d~p *_To support installation onto the Installer volume, the Installer must prevent source files from°dONLNdÖp~|&* `being disturbed.  After the user clicks the Install button, the Installer determines whether any°dONLNdÊ|~à!* etarget file matches the location of a source file.  If there is a conflict the user is alerted.  This°dONLNdLà~î * ]case is much more likely to happen when the scriptwriter allows the user to select the target°dONLNd™î~†’* application folder.
  5743. °dONLNdæ¥~√Q*""Setting the Finder flags and Dates"°∂ ¬|¬0°∂°∂
  5744. °dONLNd·«~”¯*VFormat 1 of the ‘intf’ resource supports supplying the Finder flags, creation date and°dONLNd8”~fl&* amodification date to make target file specification of archived files easier.  The Installer sets°dONLNdöfl~Î,* gthe values of a newly created file to the specified values  in the ‘intf’.  If the ‘intf’ is referenced°dONLNdÎ~˜* Wfrom a File or ResMerge Atom and the file already exists the Finder flags, creation and°dONLNdZ˜~** ]modification dates will be updated.  The Finder Flags in a File Atom will always override the°dONLNd∏~B* .Finder Flags specified in the ‘intf’ resource.°dONLNdÁ~#.*hIf you use an ‘infs’ or format 0 of the ‘intf’ the Installer continues to use the Finder flags, creation°dONLNdP#~/** band modification date of the source file.  In cases where the source file is a compressed archive,°dONLNd≥/~;* ]format1 version of the ‘intf’ is recommended.  ScriptCheck will fill in the correct flags and°dONLNd;~G"* _dates if the file does not reference an Atom Extender.  If an Atom Extender is being used, make°dONLNdqG~S%* ^sure to supply the appropriate ScriptCheck extension.  To have ScriptCheck fill in the correct°dONLNd–S~_** _values, place a zero in the Finder flags field and 1 in the Creation Date and Modification Date°dONLNd0_~k.* efields.  If the date field is zero or 1, the Installer reverts to the older method of determining the°dONLNdñk~wp* 9correct target date, such as with format 0 of the ‘intf’.
  5745. °dONLNd–è6£,(û6 Specifying Source Files (‘infs’)"°∂ £4£0°∂°∂
  5746. °dONLNdÒ®~¥-+HcThe goal of the Source File Spec is to describe where the file resides on the original distribution°dONLNdU¥~¿≤* source disk.
  5747. °dONLNdb‘~„*"Source Disk Search Path"°∂ ‚|‚0°∂°∂
  5748. °dONLNdzÁ~Û-*`Because of multiple disk installation capability, the semantics of the File Name field are a bit°dONLNd€Û~ˇ* Ycomplex.  Customers may have copied the distribution disks onto a file server and want to°dONLNd5ˇ~ %* [install from there, or they may have made floppy backup copies of the system disks provided°dONLNdë ~* ^by Apple and expect to be able to install from those.  They might also want to set up a server°dONLNd~# * _that users can install from.  In either case, the path name specified in the File Name field of°dONLNd    P#~/,* _the Source File Spec will probably be slightly off (e.g. the backup disks may not have the same°dONLNd    ∞/~;(* _names as the originals) so we need to be somewhat flexible when searching for a specific source°dONLNd
  5749. ;~G.* bfile.  In a Source File Spec, the full path name (including volume name) must be given in the File°dONLNd
  5750. sG~SØ* EName field, but it may not be used by the Installer exactly as given.°dONLNd
  5751. π[~g*_While the Installer is flexible as to exact volume names, it requires that disk contents be the°dONLNd g~s* ^same as what is specified in the script.  The Installer uses the scripts to make a list of the°dONLNd xs~(* _volumes that are needed for the installation, and the files that should be on each volume.  All°dONLNd ÿ~ã(* ^files that are supposed to be on the same volume must be on the same volume, but that volume’s°dONLNd 7ã~ó!* ^name may be different from the name given in the script.  In addition, we relax this condition°dONLNd ñó~£* [slightly to allow for hard disk and network installations.  When the Installer needs a disk°dONLNd Ú£~Ø* <specified in the script, it searches in the following order:,
  5752.  
  5753. Zapf Dingbats
  5754.     °dONLNd
  5755. /π~¬Ö*n
  5756. °dONLNd
  5757. 1∑ê√Ï)MSearch for a folder with the disk’s name at the same HFS level as the script.
  5758.     °dONLNd
  5759. Õ~÷Ö(‘~n
  5760. °dONLNd
  5761. ÅÀê◊‹)JSearch for a folder with the disk’s name at the script parent’s HFS level.ˇdˇ ˇˇˇˇd
  5762. d, Palatino
  5763. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5764.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú96,
  5765.  
  5766. Zapf Dingbats
  5767. °dONLNdS~\Ö(Z~n
  5768. °dONLNdQê]˙)PSearch for a folder with the disk’s name at the same HFS level as the Installer.
  5769.     °dONLNdSg~pÖ(n~n
  5770. °dONLNdUeêqÁ)LSearch for a folder with the disk’s name at the Installer parent’s HFS level
  5771.     °dONLNd¢{~ÑÖ(Ç~n
  5772. °dONLNd§yêÖu)2Search for an online volume with the correct name.
  5773.     °dONLNd◊è~òÖ(ñ~n
  5774. °dONLNdŸçêô')YIf the Installer was not launched from an AppleShare server volume, ask for a floppy disk°dONLNd3ôê•…*
  5775. or CD-ROM.°dONLNd>≠~π(∂~ZFor backup purposes, the Installer makes the assumption that source diskettes may have the°dONLNdôπ~≈.* ^disk name changed.  For example, the user may omit such special characters such as '©' and '™'°dONLNd¯≈~—* \when making the backup copies of the original installations disk.  To find source files, the°dONLNdU—~›&* aInstaller parses off the disk name and searches for the required files from the root level of the°dONLNd∑›~ÈÏ* Wcurrent diskette.  If the file is not found, the search criteria listed above are used.°dONLNdÒ~˝*[The disk that the Installer is on is a special case in our requesting disk and disk content°dONLNdk˝~    * ^strategies.  If possible, the Installer’s disk is always the first disk that we copy files and°dONLNd     ~* \resources from.  Also, the contents of the Installer disk are checked for correctness before°dONLNd'~!* Uanything is deleted or copied. We recommend that scriptwriters (especially for system°dONLNd}!~-* _releases) have the most important files and resources to be copied on the Installer disk, since°dONLNd›-~9 * ^that’s the only disk that we can guarantee the user has.  Otherwise, the Installer could start°dONLNd<9~E%* ^the installation, which includes deleting all appropriate target files and resources, and have°dONLNdõE~Q* ato ask for a disk that contains a crucial file, in which case the user cancels out of the dialog,°dONLNd˝Q~]'* `since that disk is for some reason not available, thereby aborting the installation, leaving the°dONLNd^]~i%* cuser worse off than before (i.e., a system that no longer boots).  This, of course, does not happen°dONLNd¬i~u* when doing a live install°dONLNd‹}~â*bFile spec. IDs of 0 should only be used for source files specifications for the deletion of files;°dONLNd@â~ï´*     when the ,
  5776. Courier°dONLNdIâ´ïœ)-noCopy°dONLNdOâœï‰)$ and °dONLNdTâ‰ï>)deleteOnInstall°dONLNdcâ>ïñ)Z flags are set in the °dONLNdyâñï∫)X'infs'°dONLNdâ∫ï‡)$     resource
  5777. °dONLNdâ≠6¡fl(º6File Spec. Reference"°∂ ¡4¡0°∂°∂
  5778. °dONLNdûΔ~“+H^This section describes the data structures and script resources needed to reference source and°dONLNd˝“~fiË* target files from atoms.
  5779. °dONLNdÚ6√(˛6Resource Descriptions"°∂ 40°∂°∂
  5780. °dONLNd,~+HbThe section describes the resource definitions for the target file specification resource (‘intf’)°dONLNdè~X* 4and the source file specification resource (‘infs’).
  5781. °dONLNdƒ36AÎ(=6#Target File Spec. Resource (‘intf’)"°∂ A4A0°∂°∂
  5782. °dONLNdËF~R+HZThe new Target File Spec. resource contains a reference to an ‘insp’ script resource which°dONLNd    CR~^* ]describes the file searching code resource, much like the Atom Extender script resource does.°dONLNd    ¢m~y®*#define°dONLNd    ™m¥y)6targetFileFlags°dONLNd    ƒm‘y⁄(v‘\°dONLNd    »x¢ÑÃ(Å¢boolean°dONLNd    —xÍѧ)HnoSearchForFile, SearchForFile;°dONLNd    Ûx‘Ñ⁄)Í\°dONLNd    ˜É¢èÃ(å¢boolean°dONLNd
  5783. ÉÍè¬)H$TypeCrNeedNotMatch, TypeCrMustMatch;°dONLNd
  5784. %É‘è⁄)Í\°dONLNd
  5785. )é¢öÍ(ó¢ fill bit[14]°dONLNd
  5786. ;éVöò)¥ /* Reserved°dONLNd
  5787. Géûö™)H*/°dONLNd
  5788. J§~∞ñ(≠~type°dONLNd
  5789. O§¢∞“)$'intf' {°dONLNd
  5790. YØêª¿(∏êswitch {°dONLNd
  5791. d∫¢Δ+
  5792. case format0:°dONLNd
  5793. u≈¥—+ key integer = 0;°dONLNd
  5794. à≈D—()ê&/* Target File Spec. Format version */°dONLNd
  5795. ≤–¥‹(Ÿ¥fileSpecFlags;°dONLNd
  5796. ƒ–D‹Ú)ê/* Target File Spec. Flags */ˇdˇ ˇˇˇˇd
  5797. d, Palatino
  5798. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5799.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú97,
  5800. Courier
  5801. °dONLNdQ¥](Z¥literal longint;°dONLNdQD]»)ê/* Target File Type */°dONLNd-\¥h(e¥literal longint;°dONLNd@\Dh⁄)ê/* Target File Creator */°dONLNd]g¥s(p¥literal integer;°dONLNdpgDs‡)ê/* Search Proc. Rsrc ID */°dONLNdèr¥~({¥evenPaddedString;°dONLNd£rD~»)ê/* Target File Path */°dONLNdº}¢â(Ü¢
  5802. case format1:°dONLNdÕà¥î+ key integer = 1;°dONLNd‡àDî()ê&/* Target File Spec. Format version */°dONLNd
  5803. ì¥ü(ú¥fileSpecFlags;°dONLNdìDüÚ)ê/* Target File Spec. Flags */°dONLNd=û¥™fi(ߥOSType;°dONLNdJûD™»)ê/* Target File Type */°dONLNdd©¥µfi(≤¥OSType;°dONLNdq©Dµ⁄)ê/* Target File Creator */°dONLNd饥¿2(Ω¥unsigned hex integer;°dONLNd§¥D¿¯)ê/* Target File Finder Flags */°dONLNdΔø¥À2(»¥unsigned hex longint;°dONLNd‹øDÀ˛)ê/* Target File Creation Date */°dONLNdˇ ¥÷2(”¥unsigned hex longint;°dONLNd D÷Ê)ê/* Target File Mod. Date */°dONLNd4’¥·fi(fi¥rsrcID;°dONLNdA’D·‡)ê/* Search Proc. Rsrc ID */°dONLNd`‡¥Ï(È¥evenPaddedString;°dONLNdt‡DÏ»)ê/* Target File Path */°dONLNdåÎê˜ú(Ùê};°dONLNdèˆ~ä(ˇ~};
  5804.     °dONLNdí~‘*Flag descriptions
  5805. °dONLNd•~!,*noSearchForFile/SearchForFile°dONLNd√ ,.+ê @Determines if the Search Procedure code resource will be called.°dONLNd,83* Use the °dONLNd
  5806. ,38Å)%
  5807. searchForFile°dONLNd,Å8)N$ flag to override the specified file°dONLNd?8D(A7path and use the list of files returned from the Search°dONLNdwDPy* Procedure code resource.°dONLNdêX~dJ(a~"TypeCrNeedNotMatch/TypeCrMustMatch°dONLNd≥co+ê ;Determines if the specified type and creator must match the°dONLNdÔo{* >file found on the target disk.  If the type and creator of the°dONLNd.{á$* ?found file do not match those specified, the installation stops°dONLNdnáì+* Cthe installation.  This is also true of any found files returned by°dONLNd≤ìüq* the Search Procedure.
  5808.     °dONLNd»©~¥◊(±~Field descriptions
  5809. °dONLNd‹∑~√fi*Target File Type°dONLNdÏ∑fi√‡)` °dONLNdÓ∑√*)0CThe file’s type if the Installer must create one during a copy.  If°dONLNd2√œ * the °dONLNd6√ œz)TypeCrMustMatch°dONLNdE√zœ)Z% flag is used and an existing file is°dONLNdkœ€(ÿ>found, its type must match the type entered in this field.  (4°dONLNd©œ€(ÿ-°dONLNd™€Á*(‰bytes)°dONLNd±Ô~˚ˆ(¯~Target File Creator °dONLNdΔÔ˚))êBThe file’s creator if the Installer must create one during a copy.°dONLNd
  5810. ˚** If the °dONLNd˚*Ñ)TypeCrMustMatch°dONLNd ˚Ñ)Z% flag is used and an existing file is°dONLNdF$(@found, its creator must match the creator entered in this field.°dONLNdà7*     (4-bytes)°dONLNdí'~3ˆ(0~Target Finder Flags °dONLNdß'3$)êAThe Finder flags to be given to a new file.  If referenced from a°dONLNdÈ3?** ?ResMerge Atom, the Finder Flags are given to the existing file.°dONLNd*?K** >The Finder flags specified in a File Atom always override this°dONLNdiKW÷* .field.  Only available in format 1.  (2-bytes)°dONLNdò_~k¸(h~Target Creation Date °dONLNdÆ_k))êBThe creation date to be given to a new file.  If referenced from a°dONLNdÚkw* ;File Atom or ResMerge Atom, the existing file is given this°dONLNd.wÉ-* Dcreation date.  Leave as 0 to use the source file’s or today’s date.°dONLNdtÉè* ;Set to 1 to have ScriptCheck update using the source file’s°dONLNd∞èõ˝* 7creation date.  Only available in format 1.   (4-bytes)°dONLNdË£~؉(¨~Target Mod. Date °dONLNd˙£Ø )ê?The modification date to be given to a new file.  If referenced°dONLNd    :ت$* >from a  File Atom or ResMerge Atom, the existing file is given°dONLNd    yª«* ?this modification date.  Leave as 0 to use the source file’s or°dONLNd    π«”* <today’s date.  Set to 1 to have ScriptCheck update using theˇ‡dˇ ˇˇˇˇd
  5811. d, Palatino
  5812. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5813.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú98
  5814. °dONLNdQ]*(ZBsource file’s modification  date.  Only available in format 1.  (4°dONLNdBQ*].(Z*-°dONLNdC]i*(fbytes),
  5815. Courier°dONLNdJq~}(z~Search Procedure Rsrc ID°dONLNdd|à#+ê ?The resource ID of an ‘insp’ resource, which describes the code°dONLNd§àî* >resource to call to perform the target file search.  (2-bytes)°dONLNd„ú~®fi(•~Target File Path°dONLNdÛúfi®‡)` °dONLNdıú®+)0@The partial path to the target file that must start with a colon°dONLNd6®¥* <or one of two reserved tokens (special-xxxx or folder-user).°dONLNdt¥¿é* (even-padded Pascal string)
  5816. °dONLNdê‘6‚Ï(fi6"Source File Spec Resource (‘infs’)"°∂ ‚4‚0°∂°∂
  5817. °dONLNd≥Á~Û]+H4The ‘infs’ script resource is referenced from atoms.°dONLNdË~®*#define°dONLNd¥)6
  5818. fileSpecFlags°dONLNd
  5819. ÊÏ( Ê\°dONLNd
  5820. ¢Ã(¢boolean°dONLNd
  5821. ͧ)HnoSearchForFile, searchForFile;°dONLNd:
  5822. ÊÏ)¸\°dONLNd>¢$Ã(!¢boolean°dONLNdGÍ$¬)H$typeCrNeedNotMatch, typeCrMustMatch;°dONLNdmÊ$Ï)¸\°dONLNdq#¢/Í(,¢ fill bit[14]°dONLNd~9~Eñ(B~type°dONLNdÉ9¢E“)$'infs' {°dONLNdúD¢P* literal longint;°dONLNdµDûPÊ)¸ /* File Type°dONLNd¬D¯P)Z*/°dONLNd«O¢[(X¢literal longint;°dONLNd‡Oû[¯)¸/* File Creator°dONLNdO
  5823. [)l*/°dONLNdıZ¢f (c¢unsigned hex longint;°dONLNdZûf
  5824. )¸/* Creation Date*/°dONLNd'e¢qˆ(n¢fileSpecFlags;°dONLNd?eûq)¸/* File Spec Flags */°dONLNdWp¢|(y¢evenPaddedString;°dONLNdqpû|¯)¸/* Full Path */°dONLNdÅ{~áä(Ñ~};
  5825.     °dONLNdÑó~¢⁄*Flags descriptions
  5826. °dONLNdò•~±,*noSearchForFile/searchForFile°dONLNd∑∞ºw+ê Ignored in Installer 4.0.°dONLNd—ƒ~–J(Õ~"typeCrNeedNotMatch/typeCrMustMatch°dONLNdıœ€
  5827. +ê 8Determines if the type and creator contained in the File°dONLNd.€Á+* ?Creator and File Type fields must exactly match the source file°dONLNdnÁÛâ* on the source disk.  Use the °dONLNdãÁâÛ„){typeCrMustMatch°dONLNdöÁ„Û-)Z flag to force the°dONLNd≠Ûˇ(¸;type and creator to match, otherwise the installation stops°dONLNdÈˇ M* with an error.
  5828.     °dONLNd¯~ ◊(~Field descriptions
  5829. °dONLNd #~/fi*Source File Type°dONLNd#fi/‡)` °dONLNd#/ë)0 The source file’s type.  If the °dONLNd>#ë/Î)ÉTypeCrMustMatch°dONLNdM#Î/ )Z
  5830.  flag is used°dONLNd[/;+(8Athe source file’s type must match the type entered in this field.°dONLNdû;G* :Otherwise, the user is told the source disk is bad and the°dONLNdŸGS®* $installation is canceled.  (4-bytes)°dONLNd˛[~gˆ(d~Source File Creator °dONLNd[gú)ê#The source file’s creator.  If the °dONLNd6[úgˆ)éTypeCrMustMatch°dONLNdE[ˆg+)Z
  5831.  flag is used°dONLNdSgs(p<source file’s creator must match the creator entered in this°dONLNdês,* Bfield.  Otherwise, the user is told the source disk is bad and the°dONLNd”ã¶* #installation is canceled. (4-bytes)°dONLNd˜ì~üÃ(ú~
  5832. Creation Date°dONLNdìÃüŒ)N °dONLNdìü)B:The creation date the source file must have, otherwise the°dONLNdAü´-* Binstallation is stopped.  Values of 0 or 1 are considered to match°dONLNdÑ´∑ç* any creation date.  (4-bytes)°dONLNd¢ø~Àfi(»~Source File Path°dONLNd≤øfiÀ‡)` °dONLNd¥øÀ )0>The full path to the source file.  (even-padded Pascal string)ˇ dˇ ˇˇˇˇd
  5833. d, Palatino
  5834. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5835.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ú99
  5836. °dONLNdQ6e (`6About File Searching (‘insp’)"°∂ e4e0°∂°∂
  5837. °dONLNdj~v!+H]Whenever you want to update or delete a file on the user’s disk but don’t know where the file°dONLNd|v~Ç&* bwill reside, you’ll need to search for it at installation time.  For those File and Resource atoms°dONLNdflÇ~é"* ayou wish to search for the target file, attach a Search Procedure (‘insp’) script resource to the°dONLNdAé~ö+* enew Target File Spec. (‘intf’) script resource, then reference the ‘intf’ resource from the atom just°dONLNdßö~¶{* <as you would the older ‘infs’ script resource.  Setting the ,
  5838. Courier°dONLNd„ö{¶…)˝
  5839. searchForFile°dONLNdö…¶)N flag in the ‘intf’°dONLNd¶~≤!(Ø~aresource will tell the Installer to call the code resource at the appropriate time.  The built-in°dONLNdf≤~æÜ* ;searching feature of the Installer will be removed and the °dONLNd°≤Üæ‘(ªÜ
  5840. searchForFile°dONLNdÆ≤‘æ))N flag in the present°dONLNd√æ~ («~ ‘infs’ resource will be ignored.°dONLNd“~fi*]The actual searching code will be supplied by you, the scriptwriter, in a code resource whose°dONLNdCfi~ÍK* 0type and ID is specified in the ‘insp’ resource.
  5841. °dONLNdt˛~
  5842. ª*"1Using File Searching with File and Resource Atoms"°∂  | 0°∂°∂
  5843. °dONLNd¶~
  5844. *ZThe file searching code resource is given a pointer to a parameter block containing useful°dONLNd~)* \information about the Installer’s environment.  The search routine performs a search for the°dONLNd^)~5%* edesired file(s), then passes back a list of those files it has found, including a result code to tell°dONLNdƒ5~A7* *the Installer whether to continue or stop.°dONLNdÔI~U)*aThe search routine’s task is to create and return a handle to an array of FoundFileRec records in°dONLNdQU~a„* the parameter block’s °dONLNdgU„a%)e fFoundFiles°dONLNdrU%aÔ)B. field.  The array should contain zero or more°dONLNd°a~m (j~^FoundFileRec records that specify each target file to act upon.  The number of elements in the°dONLNdm~y * ^array is determined by the size of the handle.  If the array has no elements, then the atom is°dONLNd_y~Ö,* dignored.  If one FoundFileRec element is specified, then the atom (file, resource, or font atom ) is°dONLNdƒÖ~ë%* ]processed normally with the designated target file.  If more than one FoundFileRec element is°dONLNd"ë~ùq* 6in the array, the atom is duplicated for each element.°dONLNdZ•~±*^The files that are returned to the Installer may or may not already exist.  The Installer will°dONLNdπ±~Ω* Yverify that the volume and directory exist and are valid, and that the file name does not°dONLNdΩ~…(* dconflict with an existing directory name.  If the file does not exist the Installer will create one,°dONLNdx…~’∂*
  5845. if necessary.
  5846. °dONLNdÜÈ~¯q*"&Using File Searching with Rule Clauses"°∂ ˜|˜0°∂°∂
  5847. °dONLNd≠¸~-*cFile searching can also be used with Target File Specs that are referenced from rule clauses.  If a°dONLNd    ~ * _Target File Spec returns more than one found file, the rule clause is duplicated for each valid°dONLNd    q~ +* bfile.  The duplicated rule clauses are “anded” with the original rule clause.  Therefore, in order°dONLNd    ‘ ~,)* `for the original rule clause to return TRUE, every duplicated rule clause must also return TRUE.
  5848. °dONLNd
  5849. 5@~O∫*"3Allowable Installer Functions During File Searching"°∂ N|N0°∂°∂
  5850. °dONLNd
  5851. iS~_*`While your file searching code resource is executing, you can call selected Installer functions.°dONLNd
  5852.  g~s*Allowable Installer functions:,
  5853.  
  5854. Zapf Dingbats
  5855.     °dONLNd
  5856. È}~ÜÖ*n
  5857. °dONLNd
  5858. Î{êá)IMemory functions:  INewHandle, IDisposHandle, ILockHandle, IUnLockHandle.
  5859.     °dONLNd 5ë~öÖ(ò~n
  5860. °dONLNd 7èêõO)*Action Handler functions:  RegisterAction.ˇLdˇ ˇˇˇˇd
  5861. d, Palatino
  5862. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5863.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó100
  5864. °dONLNdQ6e(`6File Searching Reference"°∂ e4e0°∂°∂
  5865. °dONLNdj~v%+HaThis section describes the data structures and new script resources needed to support target file°dONLNd{v~Ç≠*
  5866. searching.
  5867. °dONLNdÜñ6¶ú(¢6Data Structures"°∂ ¶4¶0°∂°∂
  5868. °dONLNdñ´~∑+HVThis section describes the function interface and parameter block passed to the Search°dONLNdÌ∑~√È* Procedure code resource.°dONLNdÀ~◊!*_The Search Procedure must return a handle to an array of records describing the files it found.°dONLNdg◊~„*  This array handle is defined as:,
  5869. Courier°dONLNdàÁ~Ûfi*typedef struct {°dONLNdôÚ~˛¥*        short °dONLNd£ÚΔ˛ˆ)HvRefNum;°dONLNd¨˝~    Æ(~   long °dONLNd∂˝Δ    Í)HparID;°dONLNdΩ~¥(~       Str63 °dONLNd«Δ‰)Hname;°dONLNdŒêÆ(êshort°dONLNd’Δ)6
  5870. fReferenceID;°dONLNd‰2Ú)l /* Reserved for internal use. */°dONLNd~*»('~7} FoundFileRec, FoundFileArray[], *FoundFileArrayPtr[],°dONLNd=)~5‰* **FoundFileHdl[];°dONLNdOC~Ol*5The handle should be allocated using the Installer’s °dONLNdÑClO®)Ó
  5871. INewHandle°dONLNdéC®OÕ)<     routine.
  5872. °dONLNdòc6qú(m6Function Interface"°∂ q4q0°∂°∂
  5873. °dONLNd´v~Ç+H^This section describes the Search Procedure function interface and the required result values.°dONLNd
  5874. ï~°*_The file search function must return one of three results to tell the Installer how to proceed:°dONLNdj•~±D*!typedef enum { kFatalSearchError °dONLNdè•å±™(Æå= -1,°dONLNdö∞ÿºD(πÿkSearchSuccessful °dONLNd∞∞座)¥= 0,°dONLNd∫ªÿ«Ä(ƒÿkCancelSearchAndInstallation°dONLNd◊ªå«û)¥= 1°dONLNdflΔΔ“ (œΔ} SearchResult;°dONLNdÔ‡~Ïà(È~;The file search function must have the following interface:°dONLNd+~¸Δ* SearchResult°dONLNd8ÿ¸Œ)Z)FileSearchRoutine( SearchProcedurePBPtr);
  5875. °dONLNdb 6ë(6Parameter Block"°∂ 40°∂°∂
  5876. °dONLNdr~*+HXThe file search code resource is passed a pointer to a parameter block containing useful°dONLNdÀ*~6
  5877. * ]information.  Your code resource will want to return a handle to a list of found files in the°dONLNd)6~BË* fFoundFileArray field.°dONLNd@F~R‰*typedef  struct {°dONLNdRQ~]ä* —>°dONLNdUQê]∫)ProcPtr°dONLNd`Q¸]b)lfCallBackProcPtr;°dONLNdr\~hä(e~—>°dONLNdu\êhÆ)short°dONLNd\¸hV)lfTargetVRefNum;°dONLNdèg~sä(p~—>°dONLNdígês®)long°dONLNdõg¸sn)lfTargetFolderDirID;°dONLNdØr~~ä({~—>°dONLNd≤rê~Æ)short°dONLNdºr¸~V)lfSystemVRefNum;°dONLNdÃ}~âä(Ü~—>°dONLNdœ}êâ®)long°dONLNdÿ}¸ât)lfSystemBlessedDirID;°dONLNdÌà~îä(ë~—>°dONLNdàêî®)long°dONLNd˘à¸î,)lfRefCon;°dONLNdì~üä(ú~—>°dONLNdìêü¥)OSType°dONLNdì¸üP)lfFileSpecType;°dONLNdû~™ä(ß~—>°dONLNd!ûꙥ)OSType°dONLNd+û¸™b)lfFileSpecCreator;°dONLNd=©~µä(≤~—>°dONLNd@©êµ®)long°dONLNdI©¸µ\)lfFileSpecCrDate;°dONLNdZ¥~¿ä(Ω~—>°dONLNd]¥ê¿∫)Str255;°dONLNdh¥¸¿P)lfFileSpecPath;°dONLNdwø~Àä(»~<-°dONLNdzøêÀˆ)FoundFileArrayHdl°dONLNdåø¸Àb)lfFoundFilesArray;°dONLNdû ~÷í(”~.} SearchProcedurePBRec, *SearchProcedurePBPtr;ˇûdˇ ˇˇˇˇd
  5878. d, Palatino
  5879. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5880.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó101°dONLNdQ~\◊(Y~Field descriptions,
  5881. Courier
  5882. °dONLNd_~kfi*fCallBackProcPtr°dONLNd%_k)ê>A pointer to the Installer’s dispatch routine.  You’ll need to°dONLNddkw* <pass this field as a parameter to glue routines that provide°dONLNd°wÉã* access to Installer functions.°dONLNd¿ã~ó“(î~fTargetVRefNum°dONLNdœãó,)ê>The target disk’s vRefNum.  When allowing the user to select a°dONLNdó£* :target application folder, this is the volume on which the°dONLNdI£ØO* folder resides.°dONLNdY∑~√Í(¿~fTargetFolderDirID°dONLNdl∑√,)êBThe target application folder’s directory ID.  This value is -1 if°dONLNdØ√œ#* @the user cannot select a target application folder.  Target File°dONLNdœ€¬* (Specs that use the reserved folder path °dONLNdœ¬€)¥ folder-user°dONLNd#œ€&)B will be°dONLNd,€Án(‰placed in this folder.°dONLNdCÔ~˚“(¯~fSystemVRefNum°dONLNdRÔ˚)ê:The system disk’s vRefNum.  Target File Specs that use the°dONLNdç˚n* reserved folder path °dONLNd¢˚n∞)` special-xxx°dONLNd≠˚∞)B will be placed in the°dONLNdƒñ(System Folder on this volume.°dONLNd‚~'($~fSystemBlessedDirID°dONLNdˆ')ê:The directory ID of the System Folder on the disk with the°dONLNd1'33* refNum °dONLNd8'33á)%fSystemVRefNum°dONLNdF'á3)T$.  This directory is not necessarily°dONLNdk3?Æ(<#the currently active System Folder.°dONLNdèG~S®(P~fRefCon°dONLNdóGS")ê?A 4-byte value defined by the scriptwriter in the ‘insp’ script°dONLNd◊S_5*     resource.°dONLNd·g~sÃ(p~
  5883. fFileSpecType°dONLNdÔgs)ê<The value from the Target File Type field of the Target File°dONLNd,s&* Spec.°dONLNd2á~ìfi(ê~fFileSpecCreator°dONLNdCáì*)ê?The value from the Target File Creator field of the Target File°dONLNdÉìü&* Spec.°dONLNdâß~≥ÿ(∞~fFileSpecCrDate°dONLNdôß≥)ê9The value from the Target File Creation Date field of the°dONLNd”≥ø[* Target File Spec.°dONLNd«~”Ã(–~
  5884. fFileSpecPath°dONLNdÛ«”)ê<The value from the Target File Path field of the Target File°dONLNd0”fl&* Spec.°dONLNd6Á~Ûfi(~fFoundFilesArray°dONLNdGÁÛ )ê>A handle to an array of found target files that is created and°dONLNdÜÛˇá* filled by the code resource.
  5885. °dONLNd£6#Ω(6Resource Description"°∂ #4#0°∂°∂
  5886. °dONLNd∏(~4*+HcThe ‘insp’ script resource is referenced from the new Target File Spec.  It defines how to call the°dONLNd4~@_* 2code resource that will perform the actual search.°dONLNdOO~[ñ*type°dONLNdTO¢[“)$'insp' {°dONLNd_Zêf¿(cêswitch {°dONLNdje¢q+
  5887. case format0:°dONLNd{p¥|+ key integer = 0;°dONLNdåp |˛)l%/* Search Procedure Format version */°dONLNdµ{¥á(Ñ¥unsigned integer;°dONLNd«{ á»)l/* Search Procedure Flags */°dONLNdÁÜ¥í(è¥literal longint;°dONLNd¯Ü í˛)l%/* Search Procedure Code Rsrc Type */°dONLNd!ë¥ù(ö¥literal integer;°dONLNd2ë ùÚ)l#/* Search Procedure Code Rsrc ID */°dONLNdYú¥®(•¥literal longint;°dONLNdjú ®å)l/* RefCon Value */°dONLNdÄߥ≥(∞¥literal longint;°dONLNdëß ≥º)l/* Required Free Memory */°dONLNdØ≤¥æ(ª¥evenPaddedString;°dONLNd¡≤ æ‘)l/* Search Procedure Summary */°dONLNd‡Ω~…ä(Δ~};°dONLNd„»~‘ä* };ˇ“dˇ ˇˇˇˇd
  5888. d, Palatino
  5889. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5890.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó102°dONLNdQ~\◊(Y~Field descriptions,
  5891. Courier
  5892. °dONLNd_~kfi*Search Procedure°dONLNd$_fik‡)` °dONLNd%_‡k˛)Flags°dONLNd*_˛k) °dONLNd,_k)=Currently reserved for use by Apple Computer, Inc.  (2-bytes)°dONLNdjs~fi(|~Search Procedure°dONLNdzsfi‡)` °dONLNd{s‡4)Code Rsrc Type°dONLNdã~ä++. @The type of the code resource that will be called to perform the°dONLNdÃäñ\* search.  (4-bytes)°dONLNdflû~™fi(ß~Search Procedure°dONLNdÔûfi™‡)` °dONLNdû‡™() Code Rsrc ID°dONLNd˛©µ"+. >The ID of the code resource that will be called to perform the°dONLNd=µ¡\* search.  (2-bytes)°dONLNdP…~’Δ(“~ RefCon Value°dONLNd]…’ )ê9The value that will be passed to the code resource in the°dONLNdó’·8* fRefCon°dONLNdû’8·)*3 field of the Search Procedure parameter block.  (4°dONLNd—’·)‚-°dONLNd“·Ì*(Íbytes)°dONLNd⁄ı~ˆ(˛~Required Free Memory°dONLNdÔı)ê:The minimum number of free bytes the Search Procedure code°dONLNd*
  5893. * :resource needs in its own heap to make local allocation of°dONLNde
  5894. )* >memory using Macintosh OS/Toolbox routines.  Enter 0 (zero) to°dONLNd§%* :not create a sub-heap and run inside the Installer’s heap.°dONLNd‡%1* 6Please  see warnings about using sub-heaps in the Atom°dONLNd1=$* @Extender section if you specify a value other than 0.  (4-bytes)°dONLNdYE~Qfi(N~Search Procedure°dONLNdiEfiQ‡)` °dONLNdjE‡Q
  5895. )Summary°dONLNdrP\++. @An optional string briefly describing the purpose of this Search°dONLNd≥\h* >Procedure.  This string is never displayed to the user.  (even°dONLNdÒ\h(e-°dONLNdÚhtq(qpadded Pascal string)
  5896. °dONLNd    å6†z(õ6&About the Disk Order Resource (‘indo’)"°∂ †4†0°∂°∂
  5897. °dONLNd0•~±!+H`By default, the Installer requests disks from the user using the order of the atoms specified in°dONLNdë±~Ω** bthe script.  This ordering is displayed in the status dialog.  With more than just a few atoms, it°dONLNdÙΩ~…* _can be very difficult to control the order of disks.  To make this easier, if an Installer Disk°dONLNdT…~’W* 3Order resource exists in the script (resource type °dONLNdá…W’{)Ÿ'indo'°dONLNdç…{’*)$)), this resource is used to determine the°dONLNd∑’~·4(fi~*ordering of the disks.  The format of the °dONLNd·’4·X)∂'indo'°dONLNdÁ’X·.)$2 resource is given below.  The resource contains a°dONLNd·~Ì(Í~^list of Pascal strings that are the names of the source disks.  These names must exactly match°dONLNdyÌ~˘˙* Tthe names of the volumes given in the source and target paths within the File Specs.°dONLNdœ~
  5898. *[For example, let’s say you have created a two disk set that uses one floppy disk and one CD°dONLNd+
  5899. ~8* *volume.  Your ‘indo’ might look like this:°dONLNdV~)*resource 'indo' (1000) {°dONLNdp(ê4Ã+
  5900. format1 {{°dONLNd}3¢?+ kExpectFloppyDisk,°dONLNdí>¢J* "Installer Disk",°dONLNd¶I¢U* kExpectCDVolume,°dONLNdπT¢`* "Applications CD"°dONLNdÃ_êk¢(hê}};°dONLNd–j~vä(s~};°dONLNd”Ñ~ê*\Specifying the expected type of source disk just helps the Installer know which type of disk°dONLNd0ê~ú* ^drive to make available to insert the requested source disk.  This feature does not affect the°dONLNdèú~®˝* Uuser’s ability to create network installation folders on an AppleShare server volume.ˇ
  5901. dˇ ˇˇˇˇd
  5902. d, Palatino
  5903. .+~3C  H  A  P  T  E  R      5,     Helvetica
  5904.     *File Specification(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó103
  5905. °dONLNdQ6eÌ(`6Disk Order Reference
  5906. °dONLNdv6ÜΩ*"Resource Description"°∂ e4e0°∂°∂"°∂ Ü4Ü0°∂°∂
  5907. °dONLNd*ã~ó+H$Format 0 of the new ‘indo’ resource:,
  5908. Courier°dONLNdOõ~ß*#define SrcDiskType°dONLNdpõÊßÏ(§Ê\°dONLNdt¶¢≤Ã(Ø¢integer°dONLNdã¶Ê≤Ï(ØÊ\°dONLNdè±¢Ω(∫¢kExpectFloppyDisk °dONLNd¢± Ω8)~= 0,°dONLNdß±DΩ‘)$/* It’s a floppy Disk */°dONLNd¿±ÊΩÏ)¢\°dONLNdƒº¢»(≈¢kExpectCDVolume °dONLNd÷º »8)~= 1,°dONLNd€ºD»û)$/* It’s a CD */°dONLNdӺʻÏ)¢\°dONLNdÚ«¢”(–¢kExpectFoldersOnVol °dONLNd« ”2)~= 2°dONLNd «D”∂)$/* It’s a folder */°dONLNd ›~ÈÃ(Ê~
  5909. type 'indo' {°dONLNd/ËêÙ¿+ switch {°dONLNd:Û¢ˇ+
  5910. case format1:°dONLNdK˛¥
  5911. + key integer = 1;°dONLNd_    ¥z* !integer = $$Countof(SrcVolArray);°dONLNdÑ¥ &* array SrcVolArray {°dONLNdùÿ+ +$ SrcDiskType;°dONLNd¨V+⁄)~/* Source Disk Type */°dONLNd»*ÿ6>(3ÿevenPaddedString;°dONLNd€*V6⁄)~/* Source Disk Name */°dONLNdı5¥A¿(>¥};°dONLNd˘@êLú(Iê};°dONLNd¸K~Wä(T~};
  5912.     °dONLNdˇg~r◊*Field descriptions
  5913. °dONLNdu~Åfi*Source Disk Type°dONLNd"ufiŇ)` °dONLNd$uÅ()0?The expected source disk type.  Currently, a floppy disk; CD or°dONLNddÅç* 9folders on a CD, HD, or AppleShare volume.  The Installer°dONLNdûçô* :primarily uses this information to determine which type of°dONLNdŸô•* >disk to eject to make room for the requested source disk.  For°dONLNd•±+* @example, if the requested source disk is expected to be a CD and°dONLNdY±Ω * @all CD drives are full, then one of the CDs will be ejected.  (2°dONLNdô± Ω$(∫ -°dONLNdöΩ…*(Δbytes)°dONLNd¢—~›fi(⁄~Source Disk Name°dONLNd≤—fi›‡)` °dONLNd¥—›()0@The name of the source disk.  The name can end in a colon if you°dONLNdı›ÈU* wish.  (2-bytes)ˇ Jdˇ ˇˇˇˇd
  5914. d, Palatino
  5915. .+~-C  H  A  P  T  E  R      6,     Helvetica
  5916.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó104
  5917. $°dONLNdQ~y•(o~Installer Functions"°∂ 40°∂°∂
  5918. °dONLNd~*    *∏WThis chapter describes the routines that are available when running as an external code°dONLNdl*~6=* *resource within the Installer environment.
  5919. °dONLNdóN6b(]6About Installer Functions"°∂ b4b0°∂°∂
  5920. °dONLNd±g~s+H\Installer functions allow the code resource writer to communicate with the Installer and use°dONLNds~,* autility routines provided by the Installer.  Some of the routines are the essential mechanism for°dONLNdp~ã** ^communicating with the Installer, such as when decompressing files during installation.  These°dONLNdœã~ó* _routines are often limited to being called from specific code resources.  Other routines may be°dONLNd/ó~£-* aavailable all the time, either as a means to getting information from the Installer or as helpful°dONLNdë£~ØΔ* utility routines.°dONLNd£∑~√%*aAll Installer callback functions are actually glue routines that you must include in your code to°dONLNd√~œ** caccess the proper routines inside the Installer.  In the discussion of each routine the name of the°dONLNdiœ~€+* 'header file and glue file is mentioned.
  5921. °dONLNdëÔ6˝õ(˘6Data I/O Routines"°∂ ˝4˝0°∂°∂
  5922. °dONLNd£~,+H_This section describes the routines available to manage reading and writing atom data.  Most of°dONLNd~* ]these routines are only available in Atom Extenders.  These routines function very similar to°dONLNda~&A* +high-level File Manager routines.  Consult °dONLNdåA&´)√Inside Macintosh:  File °dONLNd§´& )js for an overview of topics°dONLNd¿&~2(/~#such as positioning marks in files.
  5923. °dONLNd‰J6Xë(T6ReadSourceData"°∂ X4X0°∂°∂,
  5924. Courier
  5925. °dONLNdÛm~y+H"OSErr ReadSourceData( °dONLNd
  5926. myh)êCallBackProcPtr°dONLNdmzy‡)lpCallBackProcPtr,°dONLNd5xÑ2(Ålong* °dONLNd?xzÑû)lcount,°dONLNdNÉè (åPtr°dONLNdVÉzè¬)l bufferPtr );°dONLNdcù~©fi(¶~pCallBackProcPtr°dONLNdtù©o)êThe callback pointer.°dONLNdä±~Ωú(∫~count°dONLNdê±Ω)ê<The number of bytes to read from the source data.  After the°dONLNdÕΩ…Ò* 5call, the actual number of bytes read is returned in °dONLNdΩÒ…)„count°dONLNdΩ…).°dONLNd    —~›¥(⁄~    bufferPtr°dONLNd—¥›∂)6 °dONLNd—›Ø)Z'A pointer to a buffer of at least size 
  5927.     °dONLNd;“Ø›»)°count
  5928. °dONLNd@—»›À).ˇÊdˇ ˇˇˇˇd
  5929. d, Palatino
  5930. .+~*C  H  A  P  T  E  R      6,     Helvetica
  5931.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó105°dONLNdQ6Zs(X6 DESCRIPTION
  5932. °dONLNd `~lí+HThe ,
  5933. Courier°dONLNd`ílÊ)ReadSourceData°dONLNd`Êl
  5934. )TB function reads the specified number of bytes from the source data°dONLNdal~x((u~_beginning at the current position.  The supplied pointer must have already been allocated to at°dONLNd¡x~Ñ»* least the size of °dONLNd”x»ÑÊ)Jcount°dONLNdÿxÊÑÈ).°dONLNd⁄é~ö(ó~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5935.     °dONLNd/¶6Ø{(≠6 RESULT CODES
  5936. °dONLNd=Ø~ªÍ+H kNotImplementedErr°dONLNdPØıª)w30901°dONLNdVØ ªº)+!Routine not currently implemented°dONLNdxª~«ú(ƒ~noErr°dONLNd~ª    «)ã0°dONLNdĪ «F)No error°dONLNdâ«~”ú(–~ioErr°dONLNdè«”)Ç-36°dONLNdì« ”J)     I/O Error°dONLNdù”~fl¢(‹~eofErr°dONLNd§”fl)Ç-39°dONLNd®” fly) End of part reached°dONLNdºfl~ÎÆ(Ë~paramErr°dONLNd≈flÎ)Ç-50°dONLNd…fl Î∫)  Negative count or NULL bufferPtr
  5937. °dONLNd͡6
  5938. ì(    6WriteTargetData"°∂ 
  5939. 4
  5940. 0°∂°∂
  5941. °dONLNd˙"~.+H"OSErr WriteTargetData( °dONLNd".h)êCallBackProcPtr°dONLNd""z.‡)lpCallBackProcPtr,°dONLNd<-9,(6long °dONLNdF-z9û)lcount,°dONLNdU8D&(APtr °dONLNd^8zD¬)l bufferPtr );°dONLNdkR~^—([~pCallBackProcPtr°dONLNd|R^o)êThe callback pointer.°dONLNdíf~rú(o~count°dONLNdòfr)ê9The number of bytes to write to the target at the current°dONLNd“r~6*     position.°dONLNd‹Ü~í¥(è~    bufferPtr°dONLNdÂÜ¥í∂)6 °dONLNdÁÜíØ)Z'A pointer to a buffer of at least size °dONLNdÜØíÕ)°count°dONLNdÜÕí–).
  5942.     °dONLNdû6ßs(•6 DESCRIPTION
  5943. °dONLNd!≠~πí+HThe °dONLNd%≠íπÏ)WriteTargetData°dONLNd4≠Ïπ&)ZG function writes the specified number of bytes from the supplied buffer°dONLNd|π~≈(¬~\to the target beginning at the current position.  The data is not immediately written to the°dONLNdŸ≈~—!* ]target file, but rather is buffered using the Installer heap or MultiFinder temporary memory.°dONLNd8—~› * ]This reduces our need for the target disk, which is especially important when installing onto°dONLNdñ›~È∫*
  5944. floppy disks.
  5945.     °dONLNd§ı6˛n(¸6    IMPORTANT
  5946. °dONLNdÆ~m+H5Since there is overhead associated with each call to °dONLNd„m«)ÔWriteTargetData°dONLNdÚ«)Z, calls to write very°dONLNd~|(~7small amounts of data (less than 1K) should be avoided.°dONLNdA&~2*TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5947.     °dONLNdñ>6G{(E6 RESULT CODES
  5948. °dONLNd£G~SÍ+H kNotImplementedErr°dONLNd∂GıS)w30901°dONLNdºG Sº)+!Routine not currently implemented°dONLNdfiS~_ú(\~noErr°dONLNd‰S    _)ã0°dONLNdÊS _F)No error°dONLNdÔ_~kÆ(h~paramErr°dONLNd¯_k)Ç-50°dONLNd¸_ k∫)  Negative count or NULL bufferPtr°dONLNdk~w∫(t~
  5949. memFullErr°dONLNd)k˚w)}-108°dONLNd.k w∫)% Not enough memory to buffer data
  5950. °dONLNdOã6ôé(ï6ReadTargetData"°∂ ô4ô0°∂°∂
  5951. °dONLNd^Æ~∫+H"OSErr ReadTargetData( °dONLNduÆ∫h)êCallBackProcPtr°dONLNdÖÆz∫‡)lpCallBackProcPtr,°dONLNd†π≈2(¬long* °dONLNd™πz≈û)lcount,°dONLNdπƒ–&(ÕPtr °dONLNd¬ƒz–¬)l bufferPtr );ˇfidˇ ˇˇˇˇd
  5952. d, Palatino
  5953. .+~*C  H  A  P  T  E  R      6,     Helvetica
  5954.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó106
  5955. °dONLNdQ~]—(Z~pCallBackProcPtr°dONLNdQ]o)êThe callback pointer.,
  5956. Courier°dONLNd'e~qú(n~count°dONLNd-eq)ê<The number of bytes to read from the target data.  After the°dONLNdjq}Ò* 5call, the actual number of bytes read is returned in °dONLNdüqÒ})„count°dONLNd§q}).°dONLNd¶Ö~ë¥(é~    bufferPtr°dONLNdØÖ¥ë∂)6 °dONLNd±ÖëØ)Z'A pointer to a buffer of at least size 
  5957.     °dONLNdÿÜØë»)°count
  5958. °dONLNd›Ö»ëÀ).
  5959.     °dONLNdflù6¶s(§6 DESCRIPTION
  5960. °dONLNdΨ~∏í+HThe °dONLNdÔ¨í∏™)Read°dONLNdÛ¨™∏»)Target°dONLNd˘¨»∏‡)Data°dONLNd˝¨‡∏)B function reads the specified number of bytes from the target data°dONLNd@∏~ƒ((¡~_beginning at the current position.  The supplied pointer must have already been allocated to at°dONLNd†ƒ~–»* least the size of °dONLNd≤ƒ»–Ê)Jcount°dONLNd∑ƒÊ–È).
  5961.     °dONLNdπ‹6Ân(„6    IMPORTANT
  5962. °dONLNd√È~ıí+HThe °dONLNd«Èíı™)Read°dONLNdÀÈ™ı»)Target°dONLNd—È»ı‡)Data°dONLNd’ȇı,)J function can only be called while in a Version Compare code resource that°dONLNd ı~(˛~[was referenced from a Resource Atom.  Calling this function at any other time will return a°dONLNd|~
  5963. Í* kNotImplementedErr°dONLNdéÍ
  5964. )l error.°dONLNdñ~#( ~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5965.     °dONLNdÎ/68{(66 RESULT CODES
  5966. °dONLNd˘8~DÍ+H kNotImplementedErr°dONLNd 8ıD)w30901°dONLNd8 Dº)+!Routine not currently implemented°dONLNd4D~Pú(M~noErr°dONLNd:D    P)ã0°dONLNd<D PF)No error°dONLNdEP~\ú(Y~ioErr°dONLNdKP\)Ç-36°dONLNdOP \J)     I/O Error°dONLNdY\~h¢(e~eofErr°dONLNd`\h)Ç-39°dONLNdd\ hy) End of part reached°dONLNdxh~tÆ(q~paramErr°dONLNdÅht)Ç-50°dONLNdÖh t∫)  Negative count or NULL bufferPtr
  5967. °dONLNdßà6ññ(í6SetTargetDataPos"°∂ ñ4ñ0°∂°∂
  5968. °dONLNd∏´~∑+H"OSErr SetTargetDataPos(°dONLNd–´∑h)êCallBackProcPtr°dONLNd‡´z∑‡)lpCallBackProcPtr,°dONLNd˙∂¬2(øshort °dONLNd∂z¬»)l
  5969. positionMode,°dONLNd¡Õ,( long °dONLNd$¡zÕ‡)lpositionOffset );°dONLNd6–~‹—(Ÿ~pCallBackProcPtr°dONLNdG–‹o)êThe callback pointer.°dONLNd]‰~Δ(Ì~ positionMode°dONLNdj‰r)êThe positioning mode.°dONLNdį~“(~positionOffset°dONLNd鯓‘)T °dONLNdê¯t)<The positioning offset.
  5970.     °dONLNd®6s(6 DESCRIPTION
  5971. °dONLNd¥~+í+HThe °dONLNd∏í+Ú)SetTargetDataPos°dONLNd»Ú+€)`7 function sets the current position in the target data.°dONLNd5~A(>~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5972.     °dONLNdVM6V{(T6 RESULT CODES
  5973. °dONLNdcV~bÍ+H kNotImplementedErr°dONLNdvVıb)w30901°dONLNd|V bº)+!Routine not currently implemented°dONLNdûb~nú(k~noErr°dONLNd§b    n)ã0°dONLNd¶b nF)No error°dONLNdØn~z¢(w~eofErr°dONLNd∂nz)Ç-50°dONLNd∫n zô) End of target data reached°dONLNd’z~Ü¢(É~posErr°dONLNd‹zÜ)Ç-40°dONLNd‡z Ü
  5974. ) 4Attempt to position mark before start of target data
  5975. °dONLNdö6®ò(§6GetTargetDataPos"°∂ ®4®0°∂°∂
  5976. °dONLNd&Ω~…+H"OSErr GetTargetDataPos(°dONLNd>Ω…h)êCallBackProcPtr°dONLNdNΩz…‡)lpCallBackProcPtr,°dONLNdi»‘,(—long*°dONLNds»z‘‡)lpositionOffset );ˇ‰dˇ ˇˇˇˇd
  5977. d, Palatino
  5978. .+~*C  H  A  P  T  E  R      6,     Helvetica
  5979.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó107
  5980. °dONLNdQ~]—(Z~pCallBackProcPtr°dONLNdQ]o)êThe callback pointer.,
  5981. Courier°dONLNd'e~q“(n~positionOffset°dONLNd5e“q‘)T °dONLNd7eq)<8On output, contains the current position offset from the°dONLNdpq}è* beginning of the target data.
  5982.     °dONLNdéâ6ís(ê6 DESCRIPTION
  5983. °dONLNdöò~§í+HThe °dONLNdûòí§Ú)GetTargetDataPos°dONLNdÆòÚ§$)`G function returns the current position from the beginning of the target°dONLNdˆ§~∞ó(≠~data.°dONLNd˝∫~Δ*TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5984.     °dONLNdR“6€{(Ÿ6 RESULT CODES
  5985. °dONLNd_€~Á‡+H kNotImplementedErr°dONLNdr€ıÁ)w30901°dONLNdx€ Áº)+!Routine not currently implemented°dONLNdöÁ~Ûú(~noErr°dONLNd†Á    Û)ã0°dONLNd¢Á ÛF)No error
  5986. °dONLNd´6ú(6GetTargetDataEOF"°∂ 40°∂°∂
  5987. °dONLNdº*~6+H"OSErr GetTargetDataEOF(°dONLNd‘*6h)êCallBackProcPtr°dONLNd‰*z6‡)lpCallBackProcPtr,°dONLNdˇ5A,(>long*°dONLNd    5zA¬)l theLength );°dONLNdD~P—(M~pCallBackProcPtr°dONLNd'DPo)êThe callback pointer.°dONLNd=X~d¥(a~    theLength°dONLNdFX¥d∂)6 °dONLNdHXd
  5988. )Z:On output, contains the current length of the target data.
  5989.     °dONLNdÉp6ys(w6 DESCRIPTION
  5990. °dONLNdè~ãí+HThe °dONLNdìíãÚ)GetTargetDataPos°dONLNd£Úã‚)`8 function returns the current length of the target data.°dONLNd‹ï~°(û~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5991.     °dONLNd1≠6∂{(¥6 RESULT CODES
  5992. °dONLNd>∂~¬Í+H kNotImplementedErr°dONLNdQ∂ı¬)w30901°dONLNdW∂ ¬º)+!Routine not currently implemented°dONLNdy¬~Œú(À~noErr°dONLNd¬    Œ)ã0°dONLNdŬ ŒF)No error
  5993. °dONLNdä‚6ô(Ï6SetSourceDataPos"°∂ 40°∂°∂
  5994. °dONLNdõ~+H"OSErr SetSourceDataPos(°dONLNd≥h)êCallBackProcPtr°dONLNd√z‡)lpCallBackProcPtr,°dONLNdfi2(short °dONLNdËz»)l
  5995. positionMode,°dONLNd˛',($long °dONLNdz'‡)lpositionOffset );°dONLNd*~6—(3~pCallBackProcPtr°dONLNd+*6o)êThe callback pointer.°dONLNdA>~JΔ(G~ positionMode°dONLNdN>Jr)êThe positioning mode.°dONLNddR~^“([~positionOffset°dONLNdrR“^‘)T °dONLNdtR^t)<The positioning offset.
  5996.     °dONLNdåj6ss(q6 DESCRIPTION
  5997. °dONLNdòy~Öí+HThe °dONLNdúyíÖÚ)SetSourceDataPos°dONLNd¨yÚÖ⁄)`7 function sets the current position in the source data.°dONLNdÂè~õ(ò~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  5998.     °dONLNd:ß6∞{(Æ6 RESULT CODES
  5999. °dONLNdG∞~ºÍ+H kNotImplementedErr°dONLNdZ∞ıº)w30901°dONLNd`∞ ºº)+!Routine not currently implemented°dONLNdǺ~»ú(≈~noErr°dONLNdຠ   »)ã0°dONLNd亠»F)No error°dONLNdì»~‘¢(—~eofErr°dONLNdö»‘)Ç-50°dONLNdû» ‘Æ) End of source part data reached°dONLNdæ‘~‡¢(›~posErr°dONLNd≈‘‡)Ç-40°dONLNd…‘ ‡) 9Attempt to position mark before start of source part dataˇΔdˇ ˇˇˇˇd
  6000. d, Palatino
  6001. .+~*C  H  A  P  T  E  R      6,     Helvetica
  6002.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó108
  6003. °dONLNdQ6_õ([6GetSourceDataPos"°∂ _4_0°∂°∂,
  6004. Courier
  6005. °dONLNdt~Ä+H"OSErr GetSourceDataPos(°dONLNd)tÄh)êCallBackProcPtr°dONLNd9tzć)lpCallBackProcPtr,°dONLNdSã2(àlong* °dONLNd]zã‡)lpositionOffset );°dONLNdoé~ö—(ó~pCallBackProcPtr°dONLNdÄéöo)êThe callback pointer.°dONLNdñ¢~Æ“(´~positionOffset°dONLNd§¢“Æ‘)T °dONLNd¶¢Æ)<>On output, contains the current position from the beginning of°dONLNdÂÆ∫V* the source data.
  6006.     °dONLNdˆΔ6œs(Õ6 DESCRIPTION
  6007. °dONLNd’~·í+HThe °dONLNd’í·Ú)GetSourceDataPos°dONLNd’Ú·#)`G function returns the current position from the beginning of the source°dONLNd^·~Ìó(Í~data.°dONLNde˜~*TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  6008.     °dONLNd∫6{(6 RESULT CODES
  6009. °dONLNd«~$Í+H kNotImplementedErr°dONLNd⁄ı$)w30901°dONLNd‡ $º)+!Routine not currently implemented°dONLNd$~0ú(-~noErr°dONLNd$    0)ã0°dONLNd
  6010. $ 0F)No error
  6011. °dONLNdD6Rü(N6GetSourceDataEOF"°∂ R4R0°∂°∂
  6012. °dONLNd$g~s+H"OSErr GetSourceDataEOF(°dONLNd<gsh)êCallBackProcPtr°dONLNdLgzs‡)lpCallBackProcPtr,°dONLNdgr~,({long*°dONLNdqrz~¬)l theLength );°dONLNd~Å~ç—(ä~pCallBackProcPtr°dONLNdèÅço)êThe callback pointer.°dONLNd•ï~°¥(û~    theLength°dONLNdÆï¥°∂)6 °dONLNd∞ï°Î)Z2On output, contains the length of the source data.
  6013.     °dONLNd„≠6∂s(¥6 DESCRIPTION
  6014. °dONLNdÔº~»í+HThe °dONLNdÛºí»Ú)GetSourceDataPos°dONLNdºÚ»¿)`0 function returns the length of the source data.°dONLNd5“~fi(€~TSee interface file “AtomExtenderHeader.h” and glue code file “AtomExtenderCBGlue.c”.
  6015.     °dONLNdäÍ6Û{(Ò6 RESULT CODES
  6016. °dONLNdóÛ~ˇÍ+H kNotImplementedErr°dONLNd™Ûıˇ)w30901°dONLNd∞Û ˇº)+!Routine not currently implemented°dONLNd“ˇ~ ú(~noErr°dONLNdÿˇ     )ã0°dONLNd⁄ˇ  F)No error
  6017. °dONLNd„6)ú(%6Memory Routines"°∂ )4)0°∂°∂
  6018. °dONLNdÛ.~:)+H_This section describes the routines available to manage static memory.  Some code resources can°dONLNdS:~F$* \pass back a handle to static memory so the code resource can communicate between invocations°dONLNd∞F~RÀ* Lof the code resource.  Generally, these routines are available all the time.
  6019. °dONLNd˝j6x~(t6
  6020. INewHandle"°∂ x4x0°∂°∂
  6021. °dONLNdç~ô+H"Handle INewHandle( °dONLNdç¸ôV)~CallBackProcPtr°dONLNd,çhôŒ)lpCallBackProcPtr,°dONLNdFò¸§(°¸long°dONLNdOòh§»)lnewHandleSize );°dONLNd`ß~≥—(∞~pCallBackProcPtr°dONLNdqß≥o)êThe callback pointer.°dONLNdáª~«Ã(ƒ~
  6022. newHandleSize°dONLNdîªÃ«Œ)N °dONLNdñª«Ã)B*The requested size to allocate the handle.
  6023.     °dONLNd¡”6‹s(⁄6 DESCRIPTIONˇddˇ ˇˇˇˇd
  6024. d, Palatino
  6025. .+~*C  H  A  P  T  E  R      6,     Helvetica
  6026.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó109
  6027. °dONLNdQ~]í(Z~The ,
  6028. Courier°dONLNdQí]Œ)
  6029. INewHandle°dONLNdQŒ]+)<P function attempts to allocate a handle of the specified size.  If the memory is°dONLNd_]~iˆ(f~Snot immediately available, the Installer writes out any buffered target data to the°dONLNd≥i~u* \appropriate target disk, then tries again.  The resulting handle is NULL if the handle could°dONLNdu~Å…* not be allocated.°dONLNd"ã~óë*Use °dONLNd&ãëóÕ)
  6030. INewHandle°dONLNd0ãÕó&)<J when you want to pass information between invocations of an Atom Extender°dONLNd{ó~£©(†~
  6031. using the °dONLNdÖó©£)+fStaticDataHandle°dONLNdñó£{)f of the parameter block.°dONLNdØ≠~πª(∂~DSee interface file “InstallerMemoryFuncsHeader.h” and glue code file°dONLNdÙπ~≈* “InstallerMemoryCBGlue.c”.
  6032.     °dONLNd—6⁄n(ÿ6    IMPORTANT
  6033. °dONLNdfi~Í¥+H Always use °dONLNd$fi¥Í)6
  6034. IDisposHandle°dONLNd1fiͧ)N% to release a handle allocated using °dONLNdVfi§Í‡)¢
  6035. INewHandle°dONLNd`fi‡Í)<
  6036. .  Always use°dONLNdnÍ~ˆ÷(Û~HIHLock and IHUnLock when locking and unlocking a handle allocated using °dONLNd∂Í÷ˆ(Û÷
  6037. INewHandle°dONLNd¿Íˆ)<.
  6038.     °dONLNd¬6 {(    6 RESULT CODES
  6039. °dONLNdœ ~Í+H kNotImplementedErr°dONLNd‚ ı)w30901°dONLNdË  º)+!Routine not currently implemented°dONLNd
  6040. ~#ú( ~noErr°dONLNd    #)ã0°dONLNd #F)No error°dONLNd#~/∫(,~
  6041. memFullErr°dONLNd&#˚/)}-108°dONLNd+# / )%8Not enough room in the Installer’s or MultiFinder’s heap°dONLNdd/ ;4* zone
  6042. °dONLNdiO6]à(Y6
  6043. IDisposHandle"°∂ ]4]0°∂°∂
  6044. °dONLNdwr~~+H"Handle IDisposHandle( °dONLNdér~h)êCallBackProcPtr°dONLNdûrz~‡)lpCallBackProcPtr,°dONLNd∏}â8(ÜHandle °dONLNd√}zâ⁄)lstorageHandle );°dONLNd‘å~ò—(ï~pCallBackProcPtr°dONLNdÂåòo)êThe callback pointer.°dONLNd˚†~¨Ã(©~
  6045. storageHandle°dONLNd†Ã¨Œ)N °dONLNd
  6046. †¨á)BThe handle to be disposed.
  6047.     °dONLNd%∏6¡s(ø6 DESCRIPTION
  6048. °dONLNd1≈~—í+HThe °dONLNd5≈í—‡)
  6049. IDisposHandle°dONLNdB≈‡—¥)N/ function disposes the handle in the parameter °dONLNdq≈¥—)‘
  6050. storageHandle°dONLNd~≈—)N.  The°dONLNdÖ—~›u(⁄~7handle could have been allocated using the Installer’s °dONLNdº—u›±)˜
  6051. INewHandle°dONLNdΔ—±›,)< function, or with any other°dONLNd„›~ȯ(Ê~Macintosh Toolbox routine.°dONLNd˛Û~ˇª*DSee interface file “InstallerMemoryFuncsHeader.h” and glue code file°dONLNdCˇ~ * “InstallerMemoryCBGlue.c”.
  6052.     °dONLNd^6 {(6 RESULT CODES
  6053. °dONLNdk ~,Í+H kNotImplementedErr°dONLNd~ ı,)w30901°dONLNdÑ  ,º)+!Routine not currently implemented°dONLNd¶,~8ú(5~noErr°dONLNd¨,    8)ã0°dONLNdÆ, 8F)No error°dONLNd∑8~Dº(A~ nilHandleErr°dONLNdƒ8˚D)}-109°dONLNd…8 DÅ)%NULL master pointer°dONLNd›D~P≥(M~memWZErr°dONLNdÊD˚P)}-111°dONLNdÎD Pπ)%"Attempt to operate on a free block
  6054. °dONLNdd6r^(n6IHLock"°∂ r4r0°∂°∂
  6055. °dONLNdá~ìñ+H"void°dONLNdá¢ì,)$IHLock( CallBackProcPtr°dONLNd2á2ìò)êpCallBackProcPtr,°dONLNdJíÿû(õÿHandle °dONLNdRíûn)6storageHandle );°dONLNdc°~≠—(™~pCallBackProcPtr°dONLNdt°≠o)êThe callback pointer.°dONLNdäµ~¡Ã(æ~
  6056. storageHandle°dONLNdóµÃ¡Œ)N °dONLNdôµ¡f)BThe handle to lock.
  6057.     °dONLNd≠Õ6÷s(‘6 DESCRIPTIONˇ¯dˇ ˇˇˇˇd
  6058. d, Palatino
  6059. .+~*C  H  A  P  T  E  R      6,     Helvetica
  6060.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó110
  6061. °dONLNdQ~]í(Z~The ,
  6062. Courier°dONLNdQí]∂)IHLock°dONLNd
  6063. Q∂]Y)$% function locks the specified handle.°dONLNd0g~sª(p~DSee interface file “InstallerMemoryFuncsHeader.h” and glue code file°dONLNdus~* “InstallerMemoryCBGlue.c”.
  6064.     °dONLNdêã6în(í6    IMPORTANT
  6065. °dONLNdöò~§¥+H Always use °dONLNd•ò¥§ÿ)6IHLock°dONLNd´òÿ§l)$" to lock a handle allocated using °dONLNdÕòl§®)î
  6066. INewHandle°dONLNd◊ò®§´)<.
  6067.     °dONLNdŸ∞6π{(∑6 RESULT CODES
  6068. °dONLNdÊπ~≈Í+H kNotImplementedErr°dONLNd˘πı≈)w30901°dONLNdˇπ ≈º)+!Routine not currently implemented°dONLNd!≈~—ú(Œ~noErr°dONLNd'≈    —)ã0°dONLNd)≈ —F)No error°dONLNd2—~›Δ(⁄~ nilHandleErr°dONLNd?—˚›)}-109°dONLNdD— ›Å)%NULL master pointer°dONLNdX›~ÈÆ(Ê~memWZErr°dONLNda›˚È)}-111°dONLNdf› Èπ)%"Attempt to operate on a free block
  6069. °dONLNdâ˝6 p(6IHUnLock"°∂  4 0°∂°∂
  6070. °dONLNdí ~,ñ+H"void°dONLNdó ¢,fi)$
  6071. IHUnLock( °dONLNd¢ Í,D)HCallBackProcPtr°dONLNd≤ V,º)lpCallBackProcPtr,°dONLNdÀ+Í7(4ÍHandle °dONLNd÷+V7∂)lstorageHandle );°dONLNdÁ:~F—(C~pCallBackProcPtr°dONLNd¯:Fo)êThe callback pointer.°dONLNdN~ZÃ(W~
  6072. storageHandle°dONLNdNÃZŒ)N °dONLNdNZf)BThe handle to lock.
  6073.     °dONLNd1f6os(m6 DESCRIPTION
  6074. °dONLNd=u~Åí+HThe °dONLNdAuíŬ)IHUnLock°dONLNdIu¬Åo)0' function unlocks the specified handle.°dONLNdqã~óª(î~DSee interface file “InstallerMemoryFuncsHeader.h” and glue code file°dONLNd∂ó~£* “InstallerMemoryCBGlue.c”.
  6075.     °dONLNd—Ø6∏n(∂6    IMPORTANT
  6076. °dONLNd€º~»¥+H Always use °dONLNdʺ¥»‰)6IHUnLock°dONLNdÓº‰»Ç)0$ to unlock a handle allocated using °dONLNdºÇ»æ)û
  6077. INewHandle°dONLNdºæ»¡)<.
  6078.     °dONLNd‘6›{(€6 RESULT CODES
  6079. °dONLNd+›~ÈÍ+H kNotImplementedErr°dONLNd>›ıÈ)w30901°dONLNdD› Èº)+!Routine not currently implemented°dONLNdfÈ~ıú(Ú~noErr°dONLNdlÈ    ı)ã0°dONLNdnÈ ıF)No error°dONLNdwı~Δ(˛~ nilHandleErr°dONLNdÑı˚)}-109°dONLNdâı Å)%NULL master pointer°dONLNdù~
  6080. Æ(
  6081. ~memWZErr°dONLNd¶˚
  6082. )}-111°dONLNd´ 
  6083. π)%"Attempt to operate on a free block
  6084. °dONLNdŒ6+â('6Misc. Routines"°∂ +4+0°∂°∂
  6085. °dONLNd›0~<ù+H@This section describes various miscellaneous routines available.
  6086. °dONLNdT6b©(^6RegisterScriptAction"°∂ b4b0°∂°∂
  6087. °dONLNd3w~Éz+H"*void RegisterScriptAction( CallBackProcPtr°dONLNd^wåÉÚ(ÄåpCallBackProcPtr,°dONLNdyÇ é>(ã short°dONLNdÉÇåé‡)lactionClassID,°dONLNdõç ô>(ñ short°dONLNd•çåôÚ)lactionIdentifier,°dONLNd¿ò §>(° void*°dONLNd òå§∂)lparam0,°dONLNd€£ Ø>(¨ void*°dONLNd£åØ∂)lparam1,°dONLNdˆÆ ∫>(∑ void*°dONLNdÆå∫∂)lparam2,°dONLNdπ ≈>(¬ void*°dONLNdπå≈∂)lparam3,°dONLNd,ƒ –>(Õ void*°dONLNd6ƒå–Œ)l resultPtr )°dONLNdB”~fl—(‹~pCallBackProcPtr°dONLNdS”flo)êThe callback pointer.ˇ4dˇ ˇˇˇˇd
  6088. d, Palatino
  6089. .+~*C  H  A  P  T  E  R      6,     Helvetica
  6090.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó111
  6091. °dONLNdQ~]ø(Z~
  6092. actionClassID°dONLNdQ]â)êThe action class ID number.°dONLNd*e~q«(n~actionIdentifier°dONLNd;eqí)êThe action identifier number.°dONLNdYy~ÖÕ(Ç~
  6093. param0…param3°dONLNdgyÖ.)êAA pointer to data or 4-byte value used to send information to the°dONLNd©Öë£*  Action Handler about the action.°dONLNd ô~•¶(¢~    resultPtr°dONLNd‘ô•)ê8A pointer to a variable that the Action Handler can send°dONLNd
  6094. •±-* Ainformation back to the caller.  The format of the data structure°dONLNdO±Ω˘* 4is defined individually for those actions that allow°dONLNdÑΩ…Ö* modification to the result.
  6095.     °dONLNd†’6fis(‹6 DESCRIPTION
  6096. °dONLNd¨‰~í+HThe ,
  6097. Courier°dONLNd∞‰í
  6098. )RegisterScriptAction°dONLNdƒ‰
  6099. )x? function registers an action with the Installer, which will be°dONLNd~¸(˘~Yimmediately given to all loaded Action Handlers.  This function is made available to help°dONLNd^¸~&* acode resource writers easily send text messages to the Installer Debugger, using the action class°dONLNd¿~´* ?kDebuggingAction, and the action identifier kGenericDebugActID.°dONLNd~**USee interface file “ActionHandlerHeader.h” and glue code file “ActionHanderCBGlue.c”.
  6100.     °dONLNdV66?n(=6    IMPORTANT
  6101. °dONLNd`C~OÙ+HQRegisterScriptAction cannot be called from within an ActionHandler code resource.
  6102. °dONLNd≤g6u®(q6SuspendWaitCursor"°∂ u4u0°∂°∂
  6103. °dONLNdƒä~ñh+H"'void SuspendWaitCursor( CallBackProcPtr°dONLNdÏäzñÊ)¸pCallBackProcPtr )°dONLNdˇô~•—(¢~pCallBackProcPtr°dONLNdô•o)êThe callback pointer.
  6104.     °dONLNd&±6∫s(∏6 DESCRIPTION
  6105. °dONLNd2¿~õ+H Calling the °dONLNd>¿µÃ)7SuspendWaitCursor°dONLNdO¿Ã)f< function stops the wait cursor and returns the cursor to an°dONLNdåÃ~ÿ*(’~^arrow.  Use the ResumeWaitCursor to begin the wait cursor again.  This is handy if you want to°dONLNdÎÿ~‰Ü* ;show a dialog from a code resource during the installation.°dONLNd'Ó~˙˝*PSee interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.
  6106. °dONLNdx6 ¶(6ResumeWaitCursor"°∂  4 0°∂°∂
  6107. °dONLNdâ5~Ab+H"&void ResumeWaitCursor( CallBackProcPtr°dONLNd∞5hA‘)ÍpCallBackProcPtr )°dONLNd√D~P—(M~pCallBackProcPtr°dONLNd‘DPo)êThe callback pointer.
  6108.     °dONLNdÍ\6es(c6 DESCRIPTION
  6109. °dONLNdˆk~wµ+H Calling the °dONLNdkµw)7ResumeWaitCursor°dONLNdkw–)`- function sets the cursor to the wait cursor.°dONLNd@Å~ç˝(ä~PSee interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.
  6110. °dONLNdë•6≥•(Ø6IncrementStatusBar"°∂ ≥4≥0°∂°∂
  6111. °dONLNd§»~‘+H"void IncrementStatusBar( °dONLNdæ» ‘z)¢CallBackProcPtr°dONLNdŒ»å‘Ú)lpCallBackProcPtr,°dONLNdÈ” fl>(‹ short°dONLNdÛ”åfl¯)lpIncrementAmount )ˇîdˇ ˇˇˇˇd
  6112. d, Palatino
  6113. .+~*C  H  A  P  T  E  R      6,     Helvetica
  6114.     *Installer Functions(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó112
  6115. °dONLNdQ~]—(Z~pCallBackProcPtr°dONLNdQ]o)êThe callback pointer.°dONLNd'e~q”(n~pIncrementAmount°dONLNd8eqr)êNumber of increments.
  6116.     °dONLNdN}6Üs(Ñ6 DESCRIPTION
  6117. °dONLNdZå~òµ+H Calling the ,
  6118. Courier°dONLNdfåµò!)7IncrementStatusBar°dONLNdxå!ò')l< function increments the status bar during long waits inside°dONLNdµò~§"(°~ayour code resource.  Most often you’ll use this in your Action Atom code resource.  Upon entry to°dONLNd§~∞$* ^your Action Atom you are given 100 status increments to use to show progress while executing a°dONLNdv∞~º'* _single Action Atom.  The Installer limits the bar so you don’t have to worry about incrementing°dONLNd÷º~»¬* the bar too far.°dONLNdË“~fi˝*PSee interface file “ActionAtomHeader.h” and glue code file “ActionAtomCBGlue.c”.ˇ “dˇ ˇˇˇˇd
  6119. d, Palatino
  6120. .+~-C  H  A  P  T  E  R      7,     Helvetica
  6121.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó113
  6122. $°dONLNdQ~yÔ(o~Miscellaneous Features"°∂ 40°∂°∂
  6123. °dONLNd~* *∏ZThis chapter describes miscellaneous features of Installer 4.0 available to scriptwriters.
  6124. °dONLNdrB6Vı(Q6About Action Handlers"°∂ V4V0°∂°∂
  6125. °dONLNdà[~g+H_Action Handlers allow external code resources to be called in response to specific actions in a°dONLNdËg~s.* `“debug” version of the Installer.  An action might provide information about which files will be°dONLNdIs~* [replaced during the installation, the reason the script cannot be read, the outcome of Easy°dONLNd•~ãΔ* JInstall or Custom Install rule evaluation, or why the installation failed.°dONLNdÚì~ü'*`The Action Handler code resource should be located in the script file.  A “debug” version of the°dONLNdSü~´* ]Installer is available that has the necessary code to look for and send actions to all Action°dONLNd±´~∑õ* AHandlers found in the Installer application file and script file.°dONLNdÛø~À*YApple supplies an Installer Debugger implemented as an Action Handler.  Scriptwriters can°dONLNdMÀ~◊0* &write other Action Handlers as needed.
  6126. °dONLNdtÎ~˙*"Writing an Action Handler"°∂ ˘|˘0°∂°∂
  6127. °dONLNdé˛~
  6128. (*dWhen the Installer first finds and opens the Installer script file it looks for all resources in the°dONLNdÛ
  6129. ~+* cscript and Installer file with the type ‘inah’.  The ‘inah’ resource contains the type and ID is of°dONLNdW~"* Xthe actual Action Handler code resource.  Each of the code resources are loaded into the°dONLNd∞"~.
  6130. * Installer’s heap and detached.°dONLNdœ6~B*]An Installer action consists of an action class ID and an action identifier.  When a loggable°dONLNd-B~N* _action occurs in the Installer, each Action Handler code resource is called with a pointer to a°dONLNdçN~Z"* ]Action Handler parameter block.  Action Handlers will be called in order of their resource ID°dONLNdÎZ~f.* `(‘inah’ rsrc ID ).  When called the Action Handler can handle the action however it desires, but°dONLNdLf~r$* [remember that other Action Handlers may be called before and after yours.  Depending on the°dONLNd®r~~"* ^action the Action Handler may be able to modify the result value to effect the progress of the°dONLNd~~ä5* )Installer, such as when evaluating rules.°dONLNd1í~û*]The Action Handler receives an initialize action when the script is first opened, and a close°dONLNdèû~™* [action when the Installer quits.  Action Handlers can use the initialize action to allocate°dONLNdΙ~∂-* \persistent memory to communicate between invocations of the same Action Handler.  The Action°dONLNdH∂~¬£* AHandler also receives all events that pass through the Installer.ˇ@dˇ ˇˇˇˇd
  6131. d, Palatino
  6132. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6133.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó114
  6134. °dONLNdQ~`e(\~"Action Handler Runtime Environment"°∂ _|_0°∂°∂
  6135. °dONLNd#d~p *YDuring execution the Action Handler shares memory space with the Installer.  Local memory°dONLNd}p~|#* [allocation using Memory Manager calls will come from the Installer’s heap.  Action Handlers°dONLNdŸ|~àÚ* should use the Installer’s ,
  6136. Courier°dONLNdÙ|Úà.)t
  6137. INewHandle°dONLNd˛|.à)<5 routine to allocate memory that it wishes to persist°dONLNd4à~î$(ë~$between calls to the Action Handler.
  6138. °dONLNdY¨6¿(ª6Action Handler Reference"°∂ ¿4¿0°∂°∂
  6139. °dONLNdr≈~—+H_This section describes the data structures, resource descriptions and defined actions needed to°dONLNd“—~›* use or write Action Handlers.
  6140. °dONLNdÒ6ú(˝6Data Structures"°∂ 40°∂°∂
  6141. °dONLNd~+H]This section describes the function prototype, parameter block structure and defined actions.
  6142. °dONLNd^&64ú(06Function Interface"°∂ 4440°∂°∂
  6143. °dONLNdq9~E˛+HUThe Installer calls your Action Handler code resource assuming the following function°dONLNd«E~Q∂* declaration.°dONLNd‘U~a*long HandleAction( °dONLNdËU¸ah)~ActionHandlerPBPtr°dONLNd¸Uåa
  6144. )êtheActionHandlerPB );°dONLNdo~{)(x~\The Action Handler writer should look at the actionClassID and actionIdentifier to determine°dONLNdo{~á** \how to react to the action.  The four parameters, fParam0, fParam1, fParam2 and fParam3 will°dONLNdÃá~ìˇ* Vcontain additional information depending on the action.  You’ll need to include either°dONLNd#ì~ü'* X“ActionHandlerHeader.h” or “ActionHandlerHeader.p” to allow access to the defined action°dONLNd|ü~´
  6145. * !class IDs and action identifiers.
  6146. °dONLNdûø6Õë(…6Parameter Block"°∂ Õ4Õ0°∂°∂
  6147. °dONLNdÆ“~fi-+H`The Installer calls your Action Handler code resource, passing it the following parameter block.°dONLNd‚~Óÿ*typedef struct{°dONLNdÌ~˘ê* <->°dONLNd#Ì¢˘Δ)$Handle°dONLNd,̸˘V)ZfStaticDataHdl;°dONLNd<¯~ê(~ —>°dONLNd@¯¢Ã)$ProcPtr°dONLNdJ¯¸b)ZfCallBackProcPtr;°dONLNd\~ê( ~ —>°dONLNd`¢¿)$short°dONLNdi¸V)ZfTargetVRefNum;°dONLNdy~ê(~ —>°dONLNd}¢∫)$long°dONLNdÖ¸n)ZfTargetFolderDirID;°dONLNdô~%ê("~ —>°dONLNdù¢%¿)$short°dONLNd¶¸%V)ZfSystemVRefNum;°dONLNd∂$~0ê(-~ —>°dONLNd∫$¢0∫)$long°dONLNd¬$¸0t)ZfSystemBlessedDirID;°dONLNd◊/~;ê(8~ ->°dONLNd€/¢;¿)$short°dONLNd‰/¸;V)ZfActionClassID;°dONLNdÙ:~Fê(C~ ->°dONLNd¯:¢F¿)$short°dONLNd:¸Fh)ZfActionIdentifier;°dONLNdE~Qê(N~ ->°dONLNdE¢Q¿)$void*°dONLNd!E¸Q,)ZfParam0;°dONLNd*P~\ê(Y~ ->°dONLNd.P¢\¿)$void*°dONLNd7P¸\,)ZfParam1;°dONLNd@[~gê(d~ ->°dONLNdD[¢g¿)$void*°dONLNdM[¸g,)ZfParam2;°dONLNdVf~rê(o~ ->°dONLNdZf¢r¿)$void*°dONLNdcf¸r,)ZfParam3;°dONLNdmq~}ê(z~ ->°dONLNdqq¢}¿)$void*°dONLNdzq¸}>)Z fResultPtr;°dONLNdá|~àh(Ö~'} ActionHandlerPB, *ActionHandlerPBPtr;
  6148.     °dONLNdØò~£◊*Field descriptions
  6149. °dONLNd√¶~≤“*fStaticDataHdl°dONLNd“¶≤()ê:A handle created by the Action Handler using INewHandle to°dONLNd
  6150. ≤æ* :save information between calls to this Action Handler code°dONLNdHæ +* <resource.  The field is always NULL when your Action Handler°dONLNdÖ ÷!* @is initialized.  You can assign a value to this field during anyˇ,dˇ ˇˇˇˇd
  6151. d, Palatino
  6152. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6153.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó115
  6154. °dONLNdQ]&(Z>call to the Action Handler, and receive the same value in this°dONLNd?]iå* field during the next action.,
  6155. Courier°dONLNd]q~}fi(z~fCallBackProcPtr°dONLNdnq})ê>A pointer to the Installer’s dispatch routine.  You’ll need to°dONLNd≠}â* 9pass this field as a parameter to Installer function glue°dONLNdÁâï5*     routines.°dONLNdÒù~©“(¶~fTargetVRefNum°dONLNdù©,)ê>The target disk’s vRefNum.  When allowing the user to select a°dONLNd?©µ* :target application folder, this is the volume on which the°dONLNdzµ¡O* folder resides.°dONLNdä…~’Í(“~fTargetFolderDirID°dONLNdù…’,)êBThe target application folder’s directory ID.  This value is -1 if°dONLNd‡’·#* @the user cannot select a target application folder.  Target File°dONLNd!·Ì¬* (Specs that use the reserved folder path °dONLNdI·¬Ì)¥ folder-user°dONLNdT·Ì&)B will be°dONLNd]Ì˘n(ˆplaced in this folder.°dONLNdt~
  6156. “(
  6157. ~fSystemVRefNum°dONLNdÉ
  6158. )ê:The system disk’s vRefNum.  Target File Specs that use the°dONLNdæ
  6159. n* reserved folder path °dONLNd”
  6160. n∞)` special-xxx°dONLNdfi
  6161. ∞)B will be placed in the°dONLNdı%ñ("System Folder on this volume.°dONLNd-~9(6~fSystemBlessedDirID°dONLNd'-9)ê:The directory ID of the System Folder on the disk with the°dONLNdb9E3* refNum °dONLNdi93Eá)%fSystemVRefNum°dONLNdw9áE)T$.  This directory is not necessarily°dONLNdúEQÆ(N#the currently active System Folder.°dONLNd¿Y~e“(b~fActionClassID°dONLNdœYe$)êBThe action’s class ID (i.e. a script error.).  Available class IDs°dONLNdeqfi* *are defined in “ActionHandlerHeader.h” and°dONLNd=q}å* “ActionHandlerHeader.p”.°dONLNdWÖ~ë‰(é~fActionIdentifier°dONLNdiÖë)ê>The action’s identifier (i.e. couldn’t find script resource.).°dONLNd©ëù≤* $Available identifiers are defined in°dONLNdŒù©* 4“ActionHandlerHeader.h” and “ActionHandlerHeader.p”.°dONLNd±~Ωfi(∫~fParam0..fParam3°dONLNd±Ω)ê7Parameters containing extra information for the action.°dONLNdNΩ……* )Contents of the parameters are defined in°dONLNdx…’)* 7“ActionHandlerHeader.h” and “ActionHandlerHeader.p” for°dONLNd∞’·E* each action.°dONLNdΩÈ~ı∫(Ú~
  6162. fResultPtr°dONLNd»Èı*)êBA pointer to the result variable.  This is used by some actions to°dONLNd ı * <enable the Action Handler to change the result, such as with°dONLNdH
  6163. p* rules and rule clauses.
  6164. °dONLNd`!6/a(+6Actions"°∂ /4/0°∂°∂
  6165. °dONLNdh4~@¸+HYThe following is listing of the current actions supported by the Installer.  See the file°dONLNd¬@~Lƒ* G“ActionHandlerHeader.h” file for a complete description of all actions.°dONLNd
  6166. P~\æ*Action Class:  °dONLNdPæ\)@kDebuggingAction°dONLNd*\~hˆ(e~kInitializationActID°dONLNd?g~s¿* kCloseActID°dONLNdKr~~“* kStdEventActID°dONLNdZ}~âÍ* kGenericDebugActID°dONLNdmì~üæ*Action Class:  °dONLNd|ìæü )@
  6167. kScriptAction°dONLNdäü~´¸(®~kPackageNotFoundActID°dONLNd†™~∂ * kAtomNotFoundInPackageActID°dONLNdºµ~¡* kFrameworkNotFoundActID°dONLNd‘¿~ÃÍ* kRuleNotFoundActID°dONLNdÁÀ~◊* kFileSpecNotFoundActID°dONLNd˛÷~‚* kFileSpecIsBadActIDˇ Vdˇ ˇˇˇˇd
  6168. d, Palatino
  6169. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6170.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó116,
  6171. Courier
  6172. °dONLNdQ~](Z~kCouldNotOpenScriptActID°dONLNd\~h¸* kFileSpecIDIsBadActID°dONLNd/g~s‰* kAtomIDIsBadActID°dONLNdAr~~ * kNotEnoughMemoryToReadActID°dONLNd]}~âˆ* kSubHeapToSmallActID°dONLNdrà~î * kFileSpecNotFndWithRefActID°dONLNdéì~ü* kVersCompareNotFoundActID°dONLNd®û~™* kSearchProcNotFoundActID°dONLNd¡©~µ* kRuleFunctionNotFoundActID°dONLNd‹ø~Àæ*Action Class:  °dONLNdÎøæÀ)@kFireRulesAction°dONLNd¸À~◊ÿ(‘~kFrameworkActID°dONLNd ÷~‚fi* kRuleResultActID°dONLNd·~Ì* kRuleClauseResultActID°dONLNd4˜~æ*Action Class:  °dONLNdC˜æ )@
  6173. kTargetAction°dONLNdQ~¸( ~kTgtFileNotFoundActID°dONLNdg~* kTgtFileLockedActID°dONLNd{~%* kTgtErrForFileAtomActID°dONLNdì$~0* kTgtErrForRsrcAtomActID°dONLNd´/~;* kTgtErrForFontAtomActID°dONLNd√:~F* kTgtMatchesSrcErrActID°dONLNd⁄P~\æ*Action Class:  °dONLNdÈPæ\ )@
  6174. kSourceAction°dONLNd˜\~h¸(e~kSrcFileNotFoundActID°dONLNd
  6175. g~s* kSrcErrForFileAtomActID°dONLNd%r~~* kSrcErrForRsrcAtomActID°dONLNd=}~â* kSrcErrForFontAtomActID°dONLNdUà~î* kSrcErrForFolderAtomActID°dONLNdoì~ü * kSrcErrForResMergeAtomActID°dONLNdã©~µæ*Action Class:  °dONLNdö©æµ)@kExtenderAction°dONLNd™µ~¡(æ~kExtCodeRsrcNotFoundActID°dONLNdƒ¿~Ã* kExtenderRsrcNotFoundActID°dONLNdflÀ~◊* kCallBackNotAvailableActID°dONLNd˙÷~‚ˆ* kExtenderResultActID°dONLNd·~Ì* kA5NotSetCorrectlyActID°dONLNd'Ï~¯* kTgtSetupProcNotFoundActID°dONLNdB˜~* kVersCodeRsrcNotFoundActID°dONLNd]~* kActionAtomCodeRsrcNFActID°dONLNdx
  6176. ~* kSearchProcCodeRsrcNFActID°dONLNdì~$* kSearchProcBadFileActID°dONLNd´#~/* kRuleFuncCodeRsrcNFActID°dONLNdƒ.~:* kLowModuleSetupMemoryActID°dONLNdfl9~E* kNoModuleSetupMemoryActID°dONLNd˘O~[æ*Action Class:  °dONLNdOæ[)@kProgressAction°dONLNd[~gˆ(d~kClickedInstallActID°dONLNd-f~r* kClickedRemoveActID°dONLNdAq~}* kInstallationResultActID°dONLNdZ|~à* kRemovalResultActID°dONLNdná~ì* kActionAtomResultActID°dONLNdÖù~©æ*Action Class:  °dONLNdîùæ©0)@kFileProgressAction°dONLNd®©~µÃ(≤~
  6177. kFileCopiedID°dONLNd∂¥~¿fi* kFileNotCopiedID°dONLNd«ø~À* kFileNotCopiedNewerLeftID°dONLNd· ~÷* kFileNotCopiedLockedID°dONLNd¯’~·“* kFileUpdatedIDˇ ™dˇ ˇˇˇˇd
  6178. d, Palatino
  6179. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6180.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó117,
  6181. Courier
  6182. °dONLNdQ~](Z~kFileNotUpdatedKeptExistID°dONLNd\~h* kFileNotUpdatedNotExistID°dONLNd5g~s“* kFileRemovedID°dONLNdDr~~‰* kFileNotRemovedID°dONLNdV}~â* kFileNotRemovedNoExistID°dONLNdoà~î* kFileNotRemovedLockedID°dONLNdáì~üfi* kFileSetLockedID°dONLNdò©~µæ*Action Class:  °dONLNdß©æµ0)@kRsrcProgressAction°dONLNdªµ~¡Ã(æ~
  6183. kRsrcCopiedID°dONLNd…¿~Ãfi* kRsrcNotCopiedID°dONLNd⁄À~◊* kRsrcNotCopiedNewerLeftID°dONLNdÙ÷~‚* kRsrcNotCopiedNotTargetID°dONLNd·~Ì* kRsrcNotCopiedProtectedID°dONLNd(Ï~¯“* kRsrcUpdatedID°dONLNd7˜~* kRsrcNotUpdatedKeptExistID°dONLNdR~* kRsrcNotUpdatedLockedID°dONLNdj
  6184. ~* kRsrcNotUpdatedNotExistID°dONLNdÑ~$* kRsrcNotUpdatedProtectedID°dONLNdü#~/“* kRsrcRemovedID°dONLNdÆ.~:‰* kRsrcNotRemovedID°dONLNd¿9~E* kRsrcNotRemovedNoExistID°dONLNdŸD~P* kRsrcNotRemovedProtectedID°dONLNdÙO~[* kRsrcNotRemovedLockedID°dONLNd e~qæ*Action Class:  °dONLNdeæq0)@kFontProgressAction°dONLNd/q~}Ã(z~
  6185. kFontCopiedID°dONLNd=|~àfi* kFontNotCopiedID°dONLNdNá~ì“* kFontUpdatedID°dONLNd]í~û* kFontNotUpdatedKeptExistID°dONLNdxù~©* kFontNotUpdatedLockedID°dONLNdê®~¥* kFontNotUpdatedNotExistID°dONLNd™≥~ø* kFontNotUpdatedProtectedID°dONLNd≈æ~ “* kFontRemovedID°dONLNd‘…~’‰* kFontNotRemovedID°dONLNdÊ‘~‡* kFontNotRemovedNoExistID°dONLNdˇfl~Î* kFontNotRemovedLockedID°dONLNdÍ~ˆ* kFontNotRemovedProtectedID°dONLNd2~ æ*Action Class:  °dONLNdAæ <)@kFolderProgressAction°dONLNdW ~ÿ(~kFolderCopiedID°dONLNdg"~.æ*Action Class:  °dONLNdv"æ.H)@kResMergeProgressAction°dONLNdé.~:‰(7~kResMergeCopiedID
  6186. °dONLNd†I6YΩ(U6Resource Description"°∂ Y4Y0°∂°∂
  6187. °dONLNdµ^~jë+H;The template of the Action Handler resource is shown below.°dONLNdÒn~z®*#define°dONLNd˘n¥z )6actionHandlerFlags°dONLNdn‘z⁄(w‘\°dONLNdy¢Ö(Ç¢
  6188. fill bit[16];°dONLNd'è~õÃ(ò~
  6189. type 'inah' {°dONLNd7ö¢¶“+$ switch {°dONLNdC•¥±+
  6190. case format0:°dONLNdU∞Δº&+ key integer = 0;°dONLNdh∞VºŒ)ê/* Format version */°dONLNdÅªΔ«8(ƒΔactionHandlerFlags;°dONLNdñªV«Ú)ê/* Action Handler Flags */°dONLNdµΔΔ“&(œΔliteral longint;°dONLNd»ΔV“")ê"/* Action Handler Code Rsrc Type*/°dONLNdÔ—Δ›&(⁄Δliteral integer;°dONLNd—V›)ê /* Action Handler Code Rsrc ID*/ˇ
  6191. ˛dˇ ˇˇˇˇd
  6192. d, Palatino
  6193. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6194.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó118,
  6195. Courier
  6196. °dONLNdQΔ]ˆ(ZΔlongint;°dONLNdQV])ê/* Minimal Required Memory */°dONLNd0\Δh,(eΔevenPaddedString;°dONLNdD\Vhº)ê/* Description */°dONLNdYg¢sÆ(p¢};°dONLNd\r~~ä({~};
  6197.     °dONLNd_é~ô◊*Field descriptions
  6198. °dONLNdsú~®ˆ*Action Handler Flags°dONLNdáúˆ®¯)x °dONLNdâú®)=Currently reserved for use by Apple Computer, Inc.  (2-bytes)°dONLNd«∞~º,(π~Action Handler Code Rsrc Type°dONLNdª«+ê :The resource type of the Action Handler code resource.  (4°dONLNdª«(ƒ-°dONLNd «”*(–bytes)°dONLNd'€~Á (‰~Action Handler Code Rsrc ID°dONLNdCÊÚ&+ê ?The resource ID of the Action Handler code resource.  (2-bytes)°dONLNdÉ˙~(~Minimal Required Memory°dONLNdõ˙)ê8The minimum number of free bytes the Action Handler code°dONLNd‘»* +resource needs during execution.  (4-bytes)°dONLNd~&ÿ(#~Handler Summary°dONLNd&+)ê>An optional string briefly describing what this Action Handler°dONLNdP&2(* @does.  This string is never displayed to the user.  (even-padded°dONLNdë2>L* Pascal string)
  6199. °dONLNd°V6j¢(e6-About the Installer Version Resource (‘invs’)"°∂ j4j0°∂°∂
  6200. °dONLNdœo~{+HZYou may want to ensure that the version of the Installer that you used for development and°dONLNd*{~á* \testing and that you shipped is the one that is launched.  To do so, add an 'invs' Installer°dONLNdáá~ì* bVersion resource to specify the specific Installer version needed for your script.  If you require°dONLNdÍì~ü'* cInstaller 4.0 and a different version is launched and the version specified in this resource is 4.0°dONLNdNü~´!* \then the Installer will display a dialog saying something like “The Installer document [your°dONLNd´´~∑%* _document's name here] requires version [invs version number here] of the Installer application.°dONLNd ∑~√* ]Try opening the Installer application that is in the same folder as this Installer document.”°dONLNdjÀ~◊+*`The Installer uses the four hex bytes that specify the version number to compare against its own°dONLNdÀ◊~„* ^version.  The string is used only in the dialog that is displayed when the two versions do not°dONLNd*„~Ôû* match.°dONLNd1˜~í*@The following is an example 'invs' resource for Installer 4.0.3.°dONLNdr~¸*resource 'invs' (1) {°dONLNdâêΔ+     format0 {°dONLNdï¢)∫+ 0x4,°dONLNdú(¢4¿* 0x03,°dONLNd§3¢?“* release,°dONLNdØ>¢J∫* 0x0,°dONLNd∂I¢UÃ* "4.0.3"°dONLNdøTê`ñ(]ê}°dONLNd¡_~kä(h~};
  6201. °dONLNdƒ~6í(ç6Installer Version Reference
  6202. °dONLNd‡£6≥Ω*"Resource Description"°∂ í4í0°∂°∂"°∂ ≥4≥0°∂°∂
  6203. °dONLNdı∏~ƒ+H Format 0 of the ‘invs’ resource:°dONLNd»~‘Ã*
  6204. type 'invs' {°dONLNd%”êfl¿+ switch {ˇÜdˇ ˇˇˇˇd
  6205. d, Palatino
  6206. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6207.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó119,
  6208. Courier
  6209. °dONLNdQ¢](Z¢
  6210. case format0:°dONLNd\¥h+ key integer = 0;°dONLNd%g¥sÍ*     hex byte;°dONLNd1g s¬)l/* Major revision in BCD */°dONLNdPr¥~Í({¥    hex byte;°dONLNd\r ~¬)l/* Minor revision in BCD */°dONLNd{}¥âÍ(Ü¥    hex byte;°dONLNdá} âí)l/* Release Stage */°dONLNdûà¥îÍ(률   hex byte;°dONLNd™à îò)l/* Release Number */°dONLNd¬ì¥ü‰(ú¥pstring;°dONLNdŒì ü™)l/* Short Version Number°dONLNdÊì∞üÊ)ê    String */°dONLNdÒûê™ú(ßê};°dONLNdÙ©~µä(≤~};
  6211.     °dONLNd˜≈~–◊*Field descriptions
  6212. °dONLNd
  6213. ”~fl“*Major Revision°dONLNd”“fl‘)T °dONLNd”fl∞)<$The major version number.  (2-bytes)°dONLNd?Á~Û“(~Minor Revision°dONLNdMÁ“Û‘)T °dONLNdOÁÛ±)<$The minor version number.  (2-bytes)°dONLNdt˚~Ã(~
  6214. Release Stage°dONLNdÅ˚ÃŒ)N °dONLNdÉ˚!)B?The release stage.  Four release stage constants are defined in°dONLNd√)* ?the InstallerTypes.r file:  development, alpha, beta, final and°dONLNd_* release.  (2-bytes)°dONLNd'~3“(0~Release Number°dONLNd%'“3‘)T °dONLNd''3ï)<The release number.  (2-bytes)°dONLNdF;~G (D~Short Version Number String°dONLNda; G")¢ °dONLNddFR.(O@Text description of version number.  (even-padded Pascal string)
  6215. °dONLNd¶j6~m(y6'About the Script Size Resource (‘insz’)"°∂ ~4~0°∂°∂
  6216. °dONLNdŒÉ~è+HaUse of the new script resource, ‘insz’ with an ID of 1 is recommend for scripts over 10K in size.°dONLNd1è~õ * \When the script resources are loaded into memory, they actually go into a sub-heap inside of°dONLNdéõ~ß(* [the Installer’s main heap.  This improves Memory Manager performance on older machines.  In°dONLNdÍß~≥* Yprevious versions of the Installer, the size of this sub-heap was always overestimated to°dONLNdD≥~ø,* baccount for possibly compressed resources in the script file.  This older scheme has the potential°dONLNdßø~À˝* Ufor wasting precious Installer heap memory, requiring a larger application partition.°dONLNd˝”~fl!*^ScriptCheck 4.0 calculates this value and automatically places this resource into your script.°dONLNd]fl~Î)* eThe size calculated is calculated using the following script resource types:  'inaa', 'infa', 'inra',°dONLNd√Î~˜* m'inff', 'inrm', 'intf', infs', 'inpk', 'inrl', 'infr', 'inex', 'invc', 'insp', 'inat', 'inbb', 'indo', incd',°dONLNd1˜~ñ* 'insz',Times
  6217. °dONLNd7˜ñù), 
  6218. °dONLNd9˜ù∑)'icmt'
  6219. °dONLNd?˜∑æ), 
  6220. °dONLNdA˜æ◊)'inpc'
  6221. °dONLNdG˜◊fi), 
  6222. °dONLNdI˜fi˙)'inr#'.
  6223. °dONLNdQ6/Â(*6Script Size Reference
  6224. °dONLNdg@6PΩ*"Resource Description"°∂ /4/0°∂°∂"°∂ P4P0°∂°∂
  6225. °dONLNd|U~a+H Format 0 of the ‘invs’ resource:°dONLNdùe~qÃ*
  6226. type 'insz' {°dONLNd≠p¢|“+$ switch {°dONLNdπ{¥á+
  6227. case format0:°dONLNdÀÜΔí&+ key integer = 0;°dONLNd›ÜDíº)~/* Format version */°dONLNdˆëΔù,(öΔunsigned longint;°dONLNd    ëDù)~#/* Script Sub-Heap Size in bytes */°dONLNd/ú¢®Æ(•¢};°dONLNd2ß~≥ä(∞~};ˇ    8dˇ ˇˇˇˇd
  6228. d, Palatino
  6229. .+~*C  H  A  P  T  E  R      7,     Helvetica
  6230.     *Misc. Features(Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó120°dONLNdQ~\◊(Y~Field descriptions,
  6231. Courier
  6232. °dONLNd_~kˆ*Script Sub-Heap Size°dONLNd(_k&)ê?The size in bytes the script resources will require when loaded°dONLNdhkw* =into memory.  This value is used to create an optimally sized°dONLNd¶wɢ* 7sub-heap for the Installer script resources.  (4-bytes)
  6233. °dONLNdfiõ6ØΔ(™60About the Script Creation Date Resource (‘incd’)"°∂ Ø4Ø0°∂°∂
  6234. °dONLNd¥~¿-+HdThe script creation date resource holds a copy of the script file’s creation date field.  This value°dONLNdt¿~ø* Yis used by  the Installer to correctly find and verify the source files when copied to an°dONLNdŒÃ~ÿ.* ^AppleShare server.  Because the creation date of the source files may have been changed during°dONLNd-ÿ~‰* `the copy, the Installer uses the creation date in the ‘incd’ resource to calculate a delta value°dONLNdé‰~!* `using the script’s creation date stored in the file by the File Manager.  Without this resource,°dONLNdÔ~¸%* athe user may get an error after beginning the installation saying that the source files could not°dONLNdQ¸~¶*     be found.°dONLNd[~ø*GScriptCheck automatically updates or adds this resource to your script.
  6235. °dONLNd£46H:(C6Script Creation Date Reference
  6236. °dONLNd¬Y6iΩ*"Resource Description"°∂ H4H0°∂°∂"°∂ i4i0°∂°∂
  6237. °dONLNd◊n~z‘+HThe ‘incd’ resource:°dONLNdÏ~~äÃ*
  6238. type 'incd' {°dONLNd¸â¢ï+$ unsigned longint;°dONLNdâ ï)~&/* Script Creation Date in seconds. */°dONLNd7îê†ú(ùê};°dONLNd:ü~´ä(®~};
  6239.     °dONLNd=ª~Δ◊*Field descriptions
  6240. °dONLNdP…~’ˆ*Script Creation Date°dONLNde…’)ê=The original creation date in seconds of the script file.  (4°dONLNd¢…’(“-°dONLNd£’·*(fibytes)ˇÚdˇ ˇˇˇˇd
  6241. d, Palatino
  6242. .+~-C  H  A  P  T  E  R      8,     Helvetica
  6243.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó121
  6244. $°dONLNdQ~y£(o~Installation Topics"°∂ 40°∂°∂
  6245. °dONLNd~**∏[This chapter discusses information that may help some scriptwriters keep out of trouble and°dONLNdp*~6(* 'provide solutions to unique situations.
  6246. °dONLNdòN6b(]6Installing Desk Accessories"°∂ b4b0°∂°∂
  6247. °dONLNd¥s~Ç;+H!Installing into Pre-7.X Systems"°∂ Å|Å0°∂°∂
  6248. °dONLNd‘Ü~í*\Desk Accessories are installed into the System file as 'DRVR' resources.  The installer will°dONLNd1í~û** atake care of all of the DA's owned resources.  Following is an example of a resource atom used to°dONLNdìû~™^* 2install a desk accessory.  Flags with the comment ,
  6249. Courier°dONLNd≈û^™ )‡/* your choice */ °dONLNd◊û ™#)lcan be either value.°dONLNdÏÆ~∫D(∑~!resource 'inra' (raDAtoInstall) {°dONLNdπê≈Δ+     format0 {°dONLNdƒ¢–+ deleteWhenRemoving,°dONLNd/ƒ –Ü)~/* your choice */°dONLNdCœ¢€ (ÿ¢deleteWhenInstalling,°dONLNdYœ2€⁄)ê/* remove the outdated DA */°dONLNdx⁄¢Ê¿(„¢copy,°dONLNdÅ⁄¸Ê∞)Z/* Copy rsrc to destination */°dONLNd¢¢ÒÍ(Ó¢ tgtRequired,°dONLNdظÒ)Z//* Target file need already exist to install */°dONLNd·¢¸¸(˘¢updateExisting,°dONLNdÒ¸t)l/* your choice */°dONLNd˚¢(¢copyIfNewOrUpdate,°dONLNd˚ Ü)~/* your choice */°dONLNd,¢(¢ignoreProtection,°dONLNd>t)l/* your choice */°dONLNdR¢(¢
  6250. srcNeedExist,°dONLNd`¸Ï)Z(/* Rsrc needs to exist on source disk */°dONLNdã¢(Ã(%¢byName,°dONLNdï¸(∂)Z/* Use name to find the rsrc */°dONLNd∑'¢3ˆ(0¢nameMustMatch,°dONLNdΔ'¸3J)Z
  6251. /* ignored */°dONLNd÷2¢>¸(;¢fsTargetSystem,°dONLNdÊ2>()l//* Tgt file spec "System Folder:System File" */°dONLNd=¢I‰(F¢ fsSourceDA,°dONLNd%=¸IÏ)Z(/* Source file spec where to get rsrc */°dONLNdPH¢TÃ(Q¢'DRVR',°dONLNdZH¸Tn)Z/* Resource type */°dONLNdpS¢_Æ(\¢0,°dONLNdwS¸_‘)Z$/* Resource source id (must be 0) */°dONLNdû^¢jÆ(g¢0,°dONLNd•^¸j‘)Z$/* Resource target id (must be 0) */°dONLNdÃi¢uÆ(r¢0,°dONLNd”i¸u¯)Z*/* atom size (filled in by ScriptCheck) */°dONLNdt¢Ä>(}¢"Desk Accessory: DA name",°dONLNdtDÄ»)¢/* Atom description */°dONLNd4¢ãˆ(à¢"\0x00DA Name"°dONLNdC¸ãn)Z/* Resource name */°dONLNdXäêñú(ìê};°dONLNd[ï~°ä(û~};°dONLNd^Ø~ªÉ*:When installing DA's into System 6.0.x and prior, use the °dONLNdòØÉª(∏É'deleteWhenInstalling'°dONLNdÆØª')Ñ flag in°dONLNd∑ª~«€(ƒ~conjunction with the °dONLNdꀫ;)]'updateExisting'°dONLNd‹ª;«Õ)`" flag.  In general, always use the°dONLNdˇ«~”(–~'deleteWhenInstalling'°dONLNd«”i)Ñ option when using the °dONLNd,«i”…)g'updateExisting'°dONLNd<«…”+)` flag.  Conversely, use°dONLNdT”~flê(‹~the °dONLNdX”êfl,)'dontDeleteWhenInstalling'°dONLNdr”,fln)ú flag with the °dONLNdÅ”nfl¬)B'keepExisting'°dONLNd蔬fl⁄)T flag.ˇºdˇ ˇˇˇˇd
  6252. d, Palatino
  6253. .+~*C  H  A  P  T  E  R      8,     Helvetica
  6254. *Installation Topics
  6255.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó122
  6256. °dONLNdQ~`(\~Installing into System 7.X"°∂ _|_0°∂°∂
  6257. °dONLNdd~p*[Desk Accessories are installed into the Apple Menu Items Folder that is found in the System°dONLNdwp~|¬* KFolder.  Each Desk Accessory is contained in a single file.  Use a typical ,
  6258. Courier°dONLNd¬p¬|Ê(y¬'infa'°dONLNd»pÊ|()$ to install your°dONLNdŸ|~àë(Ö~DA.ˇ ödˇ ˇˇˇˇd
  6259. d, Palatino
  6260. .+~-C  H  A  P  T  E  R      9,     Helvetica
  6261.     (Ú~Installer 4.0.3 Technical Guide(ÚÉ )ó123
  6262. $°dONLNdQ~y    (o~Glossary"°∂ 40°∂°∂
  6263. °dONLNd    2~>ß*à   buffering°dONLNd2>&)ê@The act of storing up atom data to be written to the target disk°dONLNdT>J#* Alater in the installation.  This reduces the Installer’s need for°dONLNdñJV‘* /the target disk, in case the disk is ejectable.°dONLNd«^~j∞(g~ folder-user°dONLNd”^j')ê?A reserved target pathname used in target file specs to specify°dONLNdjv¥* %the user-selected application folder.°dONLNd9~~äœ(á~“live” installatio,
  6264. Courier°dONLNdK~œä’)Qn°dONLNdM~ä)?;An installation where a file in the currently active System°dONLNdâäñ!* >Folder will be deleted or modified.  This type of installation°dONLNd»ñ¢* ;always requires that all other applications are quit before°dONLNd¢Æ%* @beginning the installation.  The original file is never touched,°dONLNdEÆ∫* =and is saved to provide for cancellation of the installation.°dONLNdɬ~Œí(À~part°dONLNdଌ)ê:The portion of atom data that is given to an Atom Extender°dONLNd√Œ⁄)* <during a kBeforePart and kAfterPart message.  May or may not°dONLNd⁄Êõ*  be the same as the source piece.°dONLNd!Ó~˙∑(˜~ preflighting°dONLNd.Ó˙!)ê>The tasks performed after the user clicks the “Install” button°dONLNdm˙    * 8and before the status dialog appears.  Some of the tasks°dONLNd¶,* Aperformed are:  checking for locked files, checking for protected°dONLNdË%* ?resources, calculating required target disk space, and checking°dONLNd(*π* *if a target file equates to a source file.°dONLNdS2~>∑(;~ special-xxxx°dONLNd`2>')ê?A reserved target pathname used in target file specs to specify°dONLNd†>J* =a special folder, usually a folder in the System Folder.  The°dONLNdfiJV$* Aname of the folder is found in a ‘fld#’ resource using the folder°dONLNd VbŸ* /type ( where ‘xxxx’ is the type of the folder).°dONLNdPj~v∑(s~
  6265. source pieces°dONLNd^jv
  6266. )ê9The portions of atom data on the source disk that will be°dONLNdòvÇ)* @combined during the installation to create the target data.  For°dONLNdŸÇé* @example, a large file is split into three files so they will fit°dONLNdéö-* Aonto floppy disks.  Each of the three files would be considered a°dONLNd\ö¶F*
  6267. source piece.°dONLNdjÆ~∫ô(∑~strike°dONLNdqÆ∫Œ)ê,The combination of size and style of a font.ˇ